python 之 如何使用一些工具和方法來提高代碼的運行速度

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++重寫整個系統,因爲對大部分代碼而言,語言的速度是無關緊要的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章