国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 使用 C 優化你的 Python 代碼

使用 C 優化你的 Python 代碼

2021-04-29 01:38Linux中國Alan Smithee C/C++

Cython 創建的 C 模塊可以加速 Python 代碼的執行,這對使用效率不高的解釋型語言編寫的復雜應用是很重要的。

使用 C 優化你的 Python 代碼

Cython 創建的 C 模塊可以加速 Python 代碼的執行,這對使用效率不高的解釋型語言編寫的復雜應用是很重要的。

Cython 是 Python 編程語言的編譯器,旨在優化性能并形成一個擴展的 Cython 編程語言。作為 Python 的擴展,Cython 也是 Python 語言的超集,它支持調用 C 函數和在變量和類屬性上聲明 C 類型。這使得包裝外部 C 庫、將 C 嵌入現有應用程序或者為 Python 編寫像 Python 一樣簡單的 C 語言擴展語法變得容易。

Cython 一般用于創建 C 模塊來加速 Python 代碼的執行。這在使用解釋型語言編寫的效率不高的復雜應用中非常重要。

安裝 Cython

 

你可以在 Linux、BSD、Windows 或 macOS 上安裝 Cython 來使用 Python:

  1. $ python -m pip install Cython

安裝好后,就可以使用它了。

將 Python 轉換成 C

 

使用 Cython 的一個好的方式是從一個簡單的 “hello world” 開始。這雖然不是展示 Cython 優點的最好方式,但是它展示了使用 Cython 時發生的情況。

首先,創建一個簡單的 Python 腳本,文件命名為 hello.pyx.pyx 擴展名并不神奇,從技術上它可以是任何東西,但它是 Cython 的默認擴展名):

  1. print("hello world")

接下來,創建一個 Python 設置腳本。一個像 Python 的 makefile 一樣的 setup.py,Cython 可以使用它來處理你的 Python 代碼:

  1. from setuptools import setup
  2. from Cython.Build import cythonize
  3.  
  4. setup(
  5.     ext_modules = cythonize("hello.pyx")
  6. )

最后,使用 Cython 將你的 Python 腳本轉換為 C 代碼:

  1. $ python setup.py build_ext --inplace

你可以在你的工程目錄中看到結果。Cython 的 cythonize 模塊將 hello.pyx 轉換成一個 hello.c 文件和一個 .so 庫。這些 C 代碼有 2648 行,所以它比一個一行的 hello.pyx 源碼的文本要多很多。.so 庫也比它的源碼大 2000 倍(即 54000 字節和 20 字節相比)。然后,Python 需要運行單個 Python 腳本,所以有很多代碼支持這個只有一行的 hello.pyx 文件。

要使用 Python 的 “hello world” 腳本的 C 代碼版本,請打開一個 Python 提示符并導入你創建的新 hello 模塊:

  1. >>> import hello
  2. hello world

將 C 代碼集成到 Python 中

 

測試計算能力的一個很好的通用測試是計算質數。質數是一個比 1 大的正數,且它只有被 1 或它自己除后才會產生正整數。雖然理論很簡單,但是隨著數的變大,計算需求也會增加。在純 Python 中,可以用 10 行以內的代碼完成質數的計算。

  1. import sys
  2.  
  3. number = int(sys.argv[1])
  4. if not number <= 1:
  5. for i in range(2, number):
  6. if (number % i) == 0:
  7. print("Not prime")
  8. break
  9. else:
  10. print("Integer must be greater than 1")

這個腳本在成功的時候是不會提醒的,如果這個數不是質數,則返回一條信息:

  1. $ ./prime.py 3
  2. $ ./prime.py 4
  3. Not prime.

將這些轉換為 Cython 需要一些工作,一部分是為了使代碼適合用作庫,另一部分是為了提高性能。

腳本和庫

許多用戶將 Python 當作一種腳本語言來學習:你告訴 Python 想讓它執行的步驟,然后它來做。隨著你對 Python(以及一般的開源編程)的了解越多,你可以了解到許多強大的代碼都存在于其他應用程序可以利用的庫中。你的代碼越 不具有針對性,程序員(包括你)就越可能將其重用于其他的應用程序。將計算和工作流解耦可能需要更多的工作,但最終這通常是值得的。

在這個簡單的質數計算的例子中,將其轉換成 Cython,首先是一個設置腳本:

  1. from setuptools import setup
  2. from Cython.Build import cythonize
  3.  
  4. setup(
  5.     ext_modules = cythonize("prime.py")
  6. )

將你的腳本轉換成 C:

  1. $ python setup.py build_ext --inplace

到目前為止,一切似乎都工作的很好,但是當你試圖導入并使用新模塊時,你會看到一個錯誤:

  1. >>> import prime
  2. Traceback (most recent call last):
  3. File "<stdin>", line 1, in <module>
  4. File "prime.py", line 2, in init prime
  5. number = sys.argv[1]
  6. IndexError: list index out of range

這個問題是 Python 腳本希望從一個終端運行,其中參數(在這個例子中是要測試是否為質數的整數)是一樣的。你需要修改你的腳本,使它可以作為一個庫來使用。

寫一個庫

庫不使用系統參數,而是接受其他代碼的參數。對于用戶輸入,與其使用 sys.argv,不如將你的代碼封裝成一個函數來接收一個叫 number(或者 num,或者任何你喜歡的變量名)的參數:

  1. def calculate(number):
  2. if not number <= 1:
  3. for i in range(2, number):
  4. if (number % i) == 0:
  5. print("Not prime")
  6. break
  7. else:
  8. print("Integer must be greater than 1")

這確實使你的腳本有些難以測試,因為當你在 Python 中運行代碼時,calculate 函數永遠不會被執行。但是,Python 編程人員已經為這個問題設計了一個通用、還算直觀的解決方案。當 Python 解釋器執行一個 Python 腳本時,有一個叫 __name__ 的特殊變量,這個變量被設置為 __main__,但是當它被作為模塊導入的時候,__name__ 被設置為模塊的名字。利用這點,你可以寫一個既是 Python 模塊又是有效 Python 腳本的庫:

  1. import sys
  2.  
  3. def calculate(number):
  4. if not number <= 1:
  5. for i in range(2, number):
  6. if (number % i) == 0:
  7. print("Not prime")
  8. break
  9. else:
  10. print("Integer must be greater than 1")
  11.  
  12. if __name__ == "__main__":
  13. number = sys.argv[1]
  14. calculate( int(number) )

現在你可以用一個命令來運行代碼了:

  1. $ python ./prime.py 4
  2. Not a prime

你可以將它轉換為 Cython 來用作一個模塊:

  1. >>> import prime
  2. >>> prime.calculate(4)
  3. Not prime

C Python

 

用 Cython 將純 Python 的代碼轉換為 C 代碼是有用的。這篇文章描述了如何做,然而,Cython 還有功能可以幫助你在轉換之前優化你的代碼,分析你的代碼來找到 Cython 什么時候與 C 進行交互,以及更多。如果你正在用 Python,但是你希望用 C 代碼改進你的代碼,或者進一步理解庫是如何提供比腳本更好的擴展性的,或者你只是好奇 Python 和 C 是如何協作的,那么就開始使用 Cython 吧。

原文地址:https://linux.cn/article-13338-1.html

延伸 · 閱讀

精彩推薦
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
主站蜘蛛池模板: 国产免费性| 亚洲精品成人18久久久久 | 欧美区在线 | 红桃成人少妇网站 | 国产精品免费久久久久久 | 欧美黑人一级爽快片淫片高清 | 国产日韩一区二区三区 | 中文字幕在线观看免费 | 日韩一区二| 亚洲精品久久 | 日韩成人免费视频 | 91精品视频免费在线观看 | 大香伊蕉在人线视频777 | a网站在线观看 | 日韩成人免费 | 精品一区二区三区免费 | 欧美成人精品 | 青娱乐国产精品视频 | 91性高湖久久久久久久久网站 | 成人精品国产免费网站 | 一区二区三区免费在线观看 | 日韩精品成人 | 久久99精品一区二区三区三区 | 日韩精品一区在线视频 | 国产精品久久久久久久久久大牛 | av国产精品 | 国产一区二区三区欧美 | 精品国产一区二区三区性色av | 精品久久久久久国产 | 99久久免费看视频 | 亚洲欧美在线观看 | 最新电影在线高清免费完整观看视频 | 日本一区二区三区在线视频 | 日本中文字幕在线播放 | 欧美成人精品一区二区三区 | 久久99精品国产 | 日韩中文视频 | 欧美一区二区三区免费 | 欧美日韩综合视频 | 美女主播精品视频一二三四 | 成人国产精品久久久 |