日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

一招把你的 Python 代碼提速7倍

在我們以前的文章中,曾經(jīng)講過計(jì)算斐波那契數(shù)列的幾種方法,其中基于遞歸的方法是速度最慢的,例如計(jì)算第40項(xiàng)的值,需要36秒。如下圖所示:

一招把你的 Python 代碼提速7倍

要提高運(yùn)算速度,根本辦法當(dāng)然是改進(jìn)算法。不過算法的提高是一個(gè)長期積累加上靈機(jī)一動(dòng)的過程。我們今天要講的,是一個(gè)不費(fèi)腦筋,立竿見影的方法——把 Python 代碼編譯成 C 語言代碼。通過 C 語言的運(yùn)行效率來加速計(jì)算過程。

這個(gè)過程看起來很復(fù)雜,但實(shí)際上你并不需要編寫一行 C 語言代碼。你需要做的只是使用一個(gè)叫做 Cython 的庫把 Python 代碼編譯為 C 語言代碼即可。

首先我們來安裝 Cython,就像安裝普通的第三方庫一樣:

python3 -m pip install cython

安裝完成以后,我們單獨(dú)寫計(jì)算斐波那契數(shù)列的函數(shù):

def fib(n):
if n in [1, 2]:
return 1
return fib(n - 1) + fib(n - 2)

非常簡單的遞歸寫法。然后關(guān)鍵來了,我們要把這個(gè)文件保存為fast_fib.pyx。注意后綴是.pyx。如下圖所示:

一招把你的 Python 代碼提速7倍

然后我們創(chuàng)建一個(gè)setup.py文件,文件內(nèi)容如下:

from setuptools import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize('fast_fib.pyx'))

如下圖所示:

一招把你的 Python 代碼提速7倍

這個(gè)文件的作用,就是調(diào)用 Cython 的cythonize函數(shù)把 Python 代碼轉(zhuǎn)換為 C 代碼。

接下來,開始編譯代碼,執(zhí)行如下命令:

python3 setup.py build_ext --inplace

我的 Python 是 Python3.7,所以運(yùn)行完成以后,會(huì)生成一個(gè)fast_fib.cpython-37m-darwin.so,如果你的 Python 是3.8,這個(gè)文件名可能是fast_fib.cpython-38m-darwin.so。這個(gè)文件你可以改名字,例如改成fast_fib.so

還有一個(gè)文件叫做fast_fib.c。不過你不用打開這個(gè)文件,因?yàn)樗?200多行。并且你甚至可以直接把它刪掉。真正有用的只有這個(gè)fast_fib.cpython-38m-darwin.so文件。

你需要做的,僅僅是直接調(diào)用你的函數(shù)。我們另外創(chuàng)建一個(gè)文件test_fast_fib.py,內(nèi)容如下:

import time
from fast_fib import fib

start = time.time
result = fib(40)
end = time.time
print(f'斐波拉契數(shù)列第40項(xiàng)為:{result},耗時(shí):{end - start}秒')

運(yùn)行效果如下圖所示:

一招把你的 Python 代碼提速7倍

計(jì)算斐波那契數(shù)列第40項(xiàng)只需要5秒鐘,速度妥妥變成 Python 版本的7倍。

使用 Cython,不僅可以提高程序的運(yùn)行速度,還可以把你的核心代碼轉(zhuǎn)換為.so文件,防止別人反編譯看到你的代碼。

關(guān)于 Cython 的更多介紹,請閱讀它的官方文檔[1]

有同學(xué)可能會(huì)問,當(dāng)前文件夾下面既然有fast_fib.pyx文件,為什么當(dāng)我們執(zhí)行from fast_fib import fib的時(shí)候,不會(huì)從這個(gè)文件里面導(dǎo)入 Python 版本的代碼?

這是因?yàn)椋?code>import只會(huì)從后綴為.py/.pyc/.pyo/.so的文件中導(dǎo)入模塊,不會(huì)進(jìn)入.pyx文件中尋找。

 

官方文檔: https://cython.readthedocs.io/

分享到:
標(biāo)簽:代碼 Python
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評(píng)定2018-06-03

通用課目體育訓(xùn)練成績評(píng)定