永恒python地速_立竿見影地把你的 Python 代碼提速7倍

之前曾經測試計算斐波那契數列的幾種方法,其中基于遞歸的方法是速度最慢的,例如計算第 40 項的值,需要 36 秒。如下圖所示。

要提高運算速度,根本辦法當然是改進算法。不過算法的提高是一個長期積累加上靈機一動的過程。我們今天要講的,是一個不費腦筋,立竿見影的方法——把 Python 代碼編譯成 C 語言代碼。通過 C 語言的運行效率來加速計算過程。

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

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

python3?-m?pip?install?cython

安裝完成以后,我們單獨寫計算斐波那契數列的函數:

def fib(n):

if n in [1, 2]:

return 1

return fib(n - 1) + fib(n - 2)

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

然后我們創建一個setup.py文件,文件內容如下:

from setuptools import setup

from Cython.Build import cythonize

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

如下圖所示:

這個文件的作用,就是調用 Cython 的cythonize函數把 Python 代碼轉換為 C 代碼。

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

python3?setup.py?build_ext?--inplace

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

還有一個文件叫做fast_fib.c。不過你不用打開這個文件,因為它有3200多行。并且你甚至可以直接把它刪掉。真正有用的只有這個fast_fib.cpython-38m-darwin.so文件。

你需要做的,僅僅是直接調用你的函數。我們另外創建一個文件test_fast_fib.py,內容如下:

import time

from fast_fib import fib

start = time.time()

result = fib(40)

end = time.time()

print(f'斐波拉契數列第40項為:{result},耗時:{end - start}秒')

運行效果如下圖所示:

計算斐波那契數列第40項只需要5秒鐘,速度妥妥變成 Python 版本的7倍。

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

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

有同學可能會問,當前文件夾下面既然有fast_fib.pyx文件,為什么當我們執行from fast_fib import fib的時候,不會從這個文件里面導入 Python 版本的代碼?

這是因為,import只會從后綴為.py/.pyc/.pyo/.so的文件中導入模塊,不會進入.pyx文件中尋找。

參考資料

[1]

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

本文由 進擊的Coder 發布在 ITPUB,轉載此文請保持文章完整性,并請附上文章來源(ITPUB)及本頁鏈接。

原文鏈接:http://www.itpub.net/2020/04/17/5877/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388963.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

頂尖大學實驗室的科研方法_這是來自頂尖大學的5門免費自然語言處理課程

頂尖大學實驗室的科研方法Data Science continues to be a hot topic, but more specifically, Natural Language Processing (NLP) is increasing in demand.數據科學仍然是一個熱門話題,但更具體地說,自然語言處理(NLP)的需求正在增長。 Broadly spea…

Python學習---django知識補充之CBV

Django知識補充之CBV Django: url --> def函數 FBV[function based view] 用函數和URL進行匹配 url --> 類 CBV[function based view] 用類和URL進行匹配 POSTMAN插件 http://blog.csdn.net/zzy1078689276/article/details/77528249 基于CBV的登…

「CH2101」可達性統計 解題報告

CH2101 可達性統計 描述 給定一張N個點M條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。N,M≤30000。 輸入格式 第一行兩個整數N,M,接下來M行每行兩個整數x,y,表示從x到y的一條有向邊。 輸出格式 共N行,表示每個點能夠…

藍圖解鎖怎么用_[UE4藍圖][Materials]虛幻4中可互動的雪地材質完整實現(一)

不說廢話,先上個演示圖最終成果(腳印,雪地可慢慢恢復,地形可控制)主要原理(白話文):假如你頭上是塊白色并且可以透視的平地,來了個非洲兄弟踩上面,你拿起單反…

數據預處理工具_數據預處理

數據預處理工具As the title states this is the last project from Udacity Nanodegree. The goal of this project is to analyze demographics data for customers of a mail-order sales company in Germany.如標題所示,這是Udacity Nanodegree的最后一個項目。…

這幾日英文大匯

int > 整數. 主要?用來進?行行數學運算 str > 字符串串, 可以保存少量量數據并進?行行相應的操作 bool>判斷真假, True, False list> 存儲?大量量數據.?用[ ]表?示 tuple> 元組, 不可以發?生改變 ?用( )表?示 dict>字典,保存鍵值對,?一樣可以…

在網上收集了一部分關于使用Google API進行手機定位的資料和大家分享

在網上收集了一部分關于使用Google API進行手機定位的資料和大家分享:關于基站定位方面的介紹:http://tech.c114.net/164/a140837.html開發方面的幫助:http://www.dotblogs.com.tw/kylin/archive/2009/08/09/9964.aspxhttp://code.google.com…

background圖片疊加_css怎么讓兩張圖片疊加,不用background只用img疊加

展開全部css層疊圖片代碼://這個層為外面的父層,只需設置相對位置樣式即可//這個為里e69da5e887aa3231313335323631343130323136353331333431363030面要疊加的層,只需設置絕對樣式//這個為層里面的內容圖片//這個為父層內容或者:擴…

“入鄉隨俗,服務為主” 發明者量化兼容麥語言啦!

5年時光 我們裹挾前行。發明者量化從篳路藍縷到步履蹣跚,從以“區塊鏈資產交易”為陣地,再到以“內外盤商品期貨”為依托。再到今天全面兼容“麥語言”。每一步,我們始終都在為建立一個優秀的量化交易平臺而努力。 什么是麥語言? …

自考數據結構和數據結構導論_我跳過大學自學數據科學

自考數據結構和數據結構導論A few months back, I decided I wanted to learn data science. In order to do this, I skipped an entire semester of my data science major.幾個月前,我決定要學習數據科學。 為此, 我跳過了數據科學專業的整個學期。 …

爬取LeetCode題目——如何發送GraphQL Query獲取數據

前言 GraphQL 是一種用于 API 的查詢語言,是由 Facebook 開源的一種用于提供數據查詢服務的抽象框架。在服務端 API 開發中,很多時候定義一個接口返回的數據相對固定,因此要獲得更多信息或者只想得到某部分信息時,基于 RESTful AP…

python中的thread_Python中的thread

測試代碼import threadingimport timedef do_thread_test():print start thread time:, time.strftime(%H:%M:%S)time.sleep(5)print stop thread time:, time.strftime(%H:%M:%S)threads []for i in range(2):thread1 threading.Thread(targetdo_thread_test)thread1.setDae…

--附加數據庫失敗

--附加數據庫失敗1.產生失敗的原因比如有個數據庫,名叫HIMS,它的數據文件HIMS_Data.mdf和日志文件HIMS_Log.ldf,都放在路徑c:/Program Files/Microsoft SQL Server/MSSQL/data/下。但是這個數據庫天天跑日志,會產生上G的日志,現在通過企業管理…

十三、原生爬蟲實戰

一、簡單實例 1、需求:爬取熊貓直播某類主播人氣排行 2、了解網站結構 分類——英雄聯盟——"觀看人數" 3、找到有用的信息 二、整理爬蟲常規思路 1、使用工具chrome——F12——element——箭頭——定位目標元素 目標元素:主播名字&#xff0c…

歸一化 均值歸一化_歸一化折現累積收益

歸一化 均值歸一化Do you remember the awkward moment when someone you had a good conversation with forgets your name? In this day and age we have a new standard, an expectation. And when the expectation is not met the feeling is not far off being asked “w…

sqlserver垮庫查詢_Oracle和SQLServer中實現跨庫查詢

一、在SQLServer中連接另一個SQLServer庫數據在SQL中,要想在本地庫中查詢另一個數據庫中的數據表時,可以創建一個鏈接服務器:EXEC master.dbo.sp_addlinkedserver server N別名, srvproductN庫名,providerNSQLOLEDB, datasrcN服務器地址EXEC…

Angular2+ typescript 項目里面用require

在typescript里面怎么使用require方法呢? const jQuery require(jquery); const fip require( fonticonpicker/fonticonpicker )( jQuery ); 如果什么都不做,直接在項目里面使用,會得到以下錯誤: Cannot find name require 以下…

機器學習實踐三---神經網絡學習

Neural Networks 在這個練習中,將實現神經網絡BP算法,練習的內容是手寫數字識別。Visualizing the data 這次數據還是5000個樣本,每個樣本是一張20*20的灰度圖片fig, ax_array plt.subplots(nrows10, ncols10, figsize(6, 4))for row in range(10):fo…

Microsoft Expression Blend 2 密鑰,key

Microsoft Expression Blend 2 密鑰,key,序列TJ2R3-WHW22-B848T-B78YJ-HHJWJ號

ethereumjs/ethereumjs-common-3-test

查看test能夠讓你更好滴了解其API文檔的使用 ethereumjs-common/tests/chains.js const tape require(tape) const Common require(../index.js)tape([Common]: Initialization / Chain params, function (t) {t.test(Should initialize with chain provided, function (st) …