1.數據結構一定要選對
- 假如有百萬個數據進行排序,如果選擇列表,排序可能需要8分鐘,而選用字典,只用了十幾秒就能搞定。
2.多用python中封裝好的模塊庫
-
比如numpy,matplotlib,pandas這三個。matplotlib是繪圖庫,這個就不多說了,numpy和pandas非常強大,
-
numpy主要是用於計算的,裏面有一個多維的數組對象叫ndarray,它具有矢量算術運算能力和複雜的廣播能力,並具有執行速度快和節省空間的特點。ndarray類型擁有很多便捷的函數可以進行矩陣運算,
-
而pandas在大數據的處理方面有更加強大的能力。我在這方面的主要應用是將數據保存成.csv## 標題文件和從.csv文件中讀入的時候用到了這個模塊,用到了pandas中的Dataframe和Series,進行數據運算的時候超級方便。
3. 工具
Cython
- Cython 是Python 的C語言擴展。準確說Cython是單獨的一門語言,Cython在提速方面有很大優勢 ,它專門用來寫在Python裏面import用的擴展庫。實際上Cython的語法基本上跟 Python一致,而Cython有專門的編譯器:先將 Cython代碼轉變成C(自動加入了一大堆的C-PythonAPI),然後使用C編譯器編譯出最終的Python可調用的模塊。不過Cython的缺點是,你並不能真正編寫Python代碼,這樣一來,現有代碼將 不會完全自動轉移成功。
Numba
-
Numba ,是Cython的競爭項目。numba把Python源碼通過LLVMPy生成JIT後的.so文件來加速。不同於Cython,Numba是以JIT爲主的,加速對源碼的侵入性較小。而Cython則重點在加速高性能Python模塊的開發上,不依賴LLVMPy項目。此外numba還很不成熟,目前兼容性相當差。
import time def foo(x,y): tt = time.time() s = 0 for i in range(x,y): s += i print('Time used: {} sec'.format(time.time()-tt)) return s print(foo(1,100000000))
結果:
Time used: 6.779874801635742 sec
4999999950000000
#使用numba
from numba import jit
import time
@jit
def foo(x,y):
tt = time.time()
s = 0
for i in range(x,y):
s += i
print('Time used: {} sec'.format(time.time()-tt))
return s
print(foo(1,100000000))
結果:
Time used: 0.04680037498474121 sec
4999999950000000
Python創 始人Guido vanRossum堅信Python的許多性能問題可以歸結爲語言的使用不當。例如,對於CPU消耗過高的處理,可以通過一些方法來加速Python運行——使 用NumPy、使用多處理器擴展、或藉助外部C代碼從而避免全局解釋器鎖(GIL)——Python緩慢的根源。但由於在Python中還沒有可行的 GIL替代語言,Python仍將在短期落後於其他語言——甚至可能更長時間。
Guido van Rossum還說過:
如果你開發的系統發現了性能瓶頸,通常最有效率的做法是找到出問題的代碼塊,用速度較快的語言如C或C++寫一些代碼替換該功能或該模塊,而不是用C或C++重寫整個系統,因爲對大部分代碼而言,語言的速度是無關緊要的