什么是python编程例子_案例详解:优化Python编程的4个妙招
全文共3510字,預計學習時長7分鐘
作為數據科學家,敲出最優的Python代碼非常非常重要。別無他法,雜亂低效的代碼筆記本會消耗你的時間,也會浪費大量項目資金。經驗豐富的數據科學家和專業人士都很清楚,這樣是沒辦法和客戶合作的。
本文將列出4個可行的Python代碼優化方法,以便大家日后應用到自己的數據科學項目中。
什么是最優化?
首先來看一個直觀的例子,然后定義什么是最優化。
問題是這樣的:
假設有一個數組,其中每個指數代表一個城市,指數的值代表該城市和下一個城市之間的距離。已知兩個指數,求這兩個指數間的距離。簡單來講,就是求任意兩個指數間的總值。
大家肯定首先會想到這里可以用for循環。但是如果一共有十幾萬個城市,每秒會收到五萬多個查詢需求呢?這種情況下,for循環還是這個問題的最優解嗎?
不是了吧。此時就該揮動優化代碼的仙女棒了。
代碼最優化,簡單來講,就是在保證結果正確的前提下盡可能減少執行任務的運算量。
來算算for循環完成任務所需的運算量吧:
首先計算出上面數組中指數1和3代表的城市間的距離。
指數1和3代表城市之間的距離=(0+20+6+10)=36=>3次算術運算。
如果數組大小為100000,需求數量為50000呢?
數組總大小為100000。
需求總數為50000。
假設兩指數間的平均差異為1000。
完成該任務的算術運算總量近似值為50000*1000=50000000
這個數量非常龐大。如果數據和查詢量不斷增加,for循環將會花費更多的時間。如果想減少計算量,同時又想得到正確的結果,應該采取什么優化方法呢?
這里,使用前綴數組來計算距離是一種可能的優化方案。它是這樣運算的:
大家能理解這里的做法嗎?這樣只需一次計算就得到了同樣的城市距離!這一方法最棒的地方就是,不管指數間的差距是1還是100000,只需一次計算就能算出任意兩個指數間的距離。是不是很神奇?
我們用10萬的數組和5萬查詢量創建了一個樣本數據集。在下面的在線編程窗口中比較兩種方法所需的時間。
注意:數據集總查詢量為5萬,你可以改變execute_queries參數,執行不超過5萬的任一查詢數量,看看每種方法完成任務所花費的時間。
最優化不僅能節省時間,大大加快完成速度,還能節省計算能力!
這些要怎么應用于數據科學項目呢?大家可能已經注意到了,很多時候需要對大量數據點進行相同查詢,尤其是數據預處理階段。
所以,在編程中運用最優化方法,從而盡可能快速有效地完成任務至關重要。以下就來分享幾個提升優化Python代碼的方法。
1. Pandas.apply() – 特征工程瑰寶
Pandas 庫已經非常優化了,但是大部分人都沒有發揮它的最大作用。想想它一般會用于數據科學項目中的哪些地方。
一般首先能想到的就是特征工程,即用已有特征創造新特征。其中最高效的方法之一就是Pandas.apply(),即Pandas中的apply函數。
在Pandas.apply()中,可以傳遞用戶定義功能并將其應用到Pandas Series的所有數據點中。這個函數是Pandas庫最好的擴展功能之一,它能根據所需條件分隔數據。之后便能將其有效應用到數據處理任務中。
試著用推特的情感分析數據來計算每條推文的字數吧。可以使用dataframe iterrows函數、NumPy程序庫和apply函數等方法,再在下面的在線編程窗口中進行比較。
數據集可在此處下載:https://datahack.analyticsvidhya.com/contest/practice-problem-twitter-sentiment-analysis/?utm_source=blog&utm_medium=4-methods-optimize-python-code-data-science
apply比iterrows函數快多了。它的性能和NumPy類似,但是卻更加靈活。
文檔:https://datahack.analyticsvidhya.com/contest/practice-problem-twitter-sentiment-analysis/?utm_source=blog&utm_medium=4-methods-optimize-python-code-data-science
2. Pandas.DataFrame.loc – Python數據操作絕妙技巧
所有和數據處理打交道的數據科學家(差不多所有人了!)都應該學會這個方法。
很多時候,數據科學家需要根據一些條件更新數據集中某列的某些值。Pandas.DataFrame.loc就是此類問題最優的解決方法。
試試用它來解決下面這個問題吧。
數據集可在此處下載:https://drive.google.com/file/d/1VwXDA27zgx5jIq8C7NQW0A5rtE95e3XI/view?usp=sharing
# importing libraries
import pandas as pd
data = pd.read_csv('school.csv')
data.head()
檢查“City”變量的值計算:
現在,假設只需要排名前五位的城市,其他城市替換為“Others”,試著做一下:
# save the top cities in a list
top_cities = ['Brooklyn','Bronx','Manhattan','Jamaica','Long Island City']
# use loc to update the target
data.loc[(data.City.isin(top_cities) == False),'City'] = 'Others'
# city value counts
data.City.value_counts()
看到更新這些值有多簡單了嗎?完成此類數據操作任務最好的方法就是它了。
3. Python函數向量化
另一種解決緩慢循環的方法就是將函數向量化。這意味著新建函數會應用于輸入列表,并返回結果數組。在Python中使用向量化能至少迭代兩次,從而加速計算。
事實上,這樣不僅能加速代碼運算,還能讓代碼更加簡潔清晰。
4. Python多重處理
多重處理能使系統同時支持一個以上的處理器。
此處將數據處理分成多個任務,讓它們各自獨立運行。處理龐大的數據集時,即使是apply函數也顯得有些遲緩。
所以,來看看Python中的多重處理庫怎么大顯神通吧。
先隨機創建一百萬個點,然后計算每個點的除數。比較apply函數和多重處理完成這一任務的性能:
# importing required libraries
import pandas as pd
import math
import multiprocessing as mp
from random import randint
# function to calculate the number of divisors
def countDivisors(n) :
count = 0
for i in range(1, (int)(math.sqrt(n)) + 1) :
if (n % i == 0) :
if (n / i == i) :
count = count + 1
else :
count = count + 2
return count
# create random data
random_data = [randint(10,1000) for i in range(1,1000001)]
data = pd.DataFrame({'Number' : random_data })
data.shape
%%time
data['Number_of_divisor'] = data.Number.apply(countDivisors)
%%time
pool = mp.Pool(processes = (mp.cpu_count() - 1))
answer = pool.map(countDivisors,random_data)
pool.close()
pool.join()
這個問題中,多重處理生成的輸出比apply函數快了13倍。它的性能可能會隨著硬件系統不同而有所變化,但是必定會提升性能。
留言 點贊 關注
我們一起分享AI學習與發展的干貨
如需轉載,請后臺留言,遵守轉載規范
總結
以上是生活随笔為你收集整理的什么是python编程例子_案例详解:优化Python编程的4个妙招的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pythonrandom模块_pytho
- 下一篇: 基于stm32智能风扇_一款基于STM3