Python コードのパフォーマンス最適化のヒントの共有

WBOY
リリース: 2016-06-16 08:47:02
オリジナル
1152 人が閲覧しました

Python のパフォーマンスを最適化する方法が、この記事で説明する主な問題です。この記事では、一般的なコード最適化方法、パフォーマンス最適化ツールの使用方法、コード パフォーマンスのボトルネックを診断する方法について説明します。Python 開発者にとって参考になると幸いです。

Python コードの最適化に関する一般的なヒント
コードの最適化により、プログラムの実行結果を変えることなく、プログラムをより効率的に実行できます。 20 原則では、プログラムの再構築、最適化、拡張、および文書化関連事項の実装には、通常、作業負荷の 80% が必要です。最適化には通常、コードのサイズの削減とコードの動作効率の向上という 2 つの側面が含まれます。
アルゴリズムを改善し、適切なデータ構造を選択する
優れたアルゴリズムはパフォーマンスに重要な役割を果たす可能性があるため、パフォーマンス向上の最初のポイントはアルゴリズムを改善することです。アルゴリズムの時間計算量の順序は次のとおりです。
O(1) -> O(lg n) -> O(n ^) 3) -> O(n^k) -> O(k^n) -> O(n!)
したがって、時間計算量の点でアルゴリズムを改善できれば、パフォーマンスは向上します。改善は自明の理です。ただし、特定のアルゴリズムの改善についてはこの記事の範囲を超えており、読者はこの情報を自分で参照することができます。次の内容は、データ構造の選択に焦点を当てます。
•辞書とリスト
Python 辞書はハッシュ テーブルを使用するため、検索操作の複雑さは O(1) であり、リストは実際には配列全体を検索する必要があります。リストの複雑さは O(n) であるため、メンバーの検索やアクセスなどの辞書操作はリストよりも高速です。

リスト 1. コード dict.py

コードをコピーします コードは次のとおりです。

from time import time
t = time()
list = ['a','b','is','python','jason','hello','hill','with','phone ',' test',
'dfdf','apple','pdf','ind','basic','none','baecr','var','bana','dd',' wrd']
#list = dict.fromkeys(list,True)
print list
filter = []
for i in range (1000000):
for find in ['is' ,'hat ','new','list','old','.']:
リストにない場合:
filter.append(find)
print "合計実行時間:"
print time()-t

上記のコードの実行には約 16.09 秒かかります。 #list = dict.fromkeys(list,True) 行のコメントを削除し、リストを辞書に変換して実行すると、時間は約 8.375 秒となり、効率が約半分になります。したがって、複数のデータ メンバーを頻繁に検索またはアクセスする必要がある場合は、リストの代わりに dict を使用することをお勧めします。
•集合とリスト
集合の和集合、積集合、および差分演算は、リストの反復よりも高速です。したがって、リストの共通部分、和集合、または差分を見つける必要がある場合は、集合演算に変換できます。

リスト 2. リストの共通部分を見つけます:
コードをコピーします コードは次のとおりです:

from time import time
t = time()
lista=[1,2,3,4,5,6,7,8,9,13,34,53,42,44]
listb=[2, 4,6,9,23]
intersection=[]
範囲 (1000000) の i の場合:
lista の a の場合:
listb の b の場合:
if a == b :
intersection.append(a)

print "合計実行時間:"
print time()-t

の実行時間上記のプログラムはおよそ次のとおりです:
合計実行時間:
38.4070000648
リスト 3. set を使用して交差を検索します
コードをコピー コードは次のとおりです:

from time import time
t = time()
lista=[1,2,3,4,5,6,7,8,9,13 ,34,53,42,44]
listb=[2,4,6,9,23]
intersection=[]
範囲 (1000000) の i:
list(set( lista)&set(listb))
print "total run time:"
print time()-t

set に変更すると、プログラムの実行時間は 8.75 分に短縮されます。 、4倍以上に増加し、実行時間が大幅に短縮されました。読者は、表 1 の他の操作をテストに使用できます。
表 1. set の一般的な使用法
構文 操作手順
set(list1) set(list2) Union list1 と list2 のすべてのデータを含む新しいセット
set(list1) & set( list2) 交差 list1 と list2 に共通する要素を含む新しいセット
set(list1) - set(list2) 差分 list1 には現れるが list2 には現れない要素のセット

ループの最適化
ループ最適化の原則は、ループ プロセスの計算量を最小限に抑え、複数のループがある場合は、内側の層の計算を上位レベルに移動することです。 次の例は、ループの最適化によってもたらされるパフォーマンスの向上を比較するために使用されます。リスト 4 では、ループ最適化なしのおおよその実行時間は約 132.375 です。

リスト 4. ループ最適化の前にコードをコピーします
コードは次のとおりです。

from timeインポート時間
t = time()
lista = [1,2,3,4,5,6,7,8,9,10]
listb =[0.1,0.2,0.3,0.4, 0.5, 0.6,0.7,0.8,0.9,0.01]
範囲 (1000000) の i の場合:
範囲 (len(lista)) の a の場合:
範囲 (len(listb)) の b の場合:
x=lista[a]+listb[b]
print "合計実行時間:"
print time()-t

ここで次の最適化を実行し、長さの計算をループの外に移動し、range を xrange に置き換えて、第 3 レベルの計算 lista[a] をループの第 2 レベルに移動します。

リスト 5. ループ最適化後
コードをコピー コードは次のとおりです。

from time import time
t = time()
lista = [1,2,3,4,5,6,7,8,9,10]
listb =[0.1,0.2,0.3,0.4,0.5 ,0.6, 0.7,0.8,0.9,0.01]
len1=len(lista)
len2=len(listb)
for i in xrange (1000000):
for a in xrange(len1) :
temp=lista[a]
for b in xrange(len2):
x=temp+listb[b]
print "合計実行時間:"
print time()- t

上記の最適化されたプログラムの実行時間は 102.171999931 に短縮されます。リスト 4 では lista[a] の計算回数は 1000000*10*10 ですが、最適化コードでは計算回数が 1000000*10 と大幅に短縮され、パフォーマンスが向上します。改善されています。
遅延 if 評価の機能を最大限に活用する
Python の条件式は遅延評価、つまり、条件式 if x と y がある場合、x が false の場合、y の値式は「これ以上の計算はありません」になります。したがって、この機能を使用すると、プログラムの効率をある程度向上させることができます。

リスト 6. Lazy if-evaluation の機能の使用
コードをコピーします コードは次のとおりです。

from time import time
t = time()
略語 = ['cf.', 'e.g.', 'ex.', 'etc.', 'fig.', 'i.e.', ' Mr.', ' vs.']
for i in range (1000000):
for w in ('Mr.', 'Hat', 'is', 'chasing', 'the', 'black ', 'cat' , '.'):
if w の省略形:
#if w[-1] == '.' および w の省略形:
pass
print "合計実行time:"
print time()-t

最適化前のプログラムの実行時間は約 8.84 です。最初の if の代わりにコメント行を使用した場合、実行時間は約 8.84 です。 6.17。
文字列の最適化
Python の文字列オブジェクトは不変であるため、スプライシングや変更などの文字列操作は、元の文字列に基づくものではなく、新しい文字列オブジェクトを生成します。したがって、この連続コピーは、 Pythonの性能もある程度は向上します。文字列の最適化も、特に大量のテキストを処理する場合のパフォーマンス向上の重要な側面です。文字列の最適化は主に次の点に焦点を当てています:
1. 文字列接続を使用する場合は、+ の代わりに join() を使用してみてください。文字列接続のコード リスト 7 で + を使用すると約 0.125 秒かかりますが、join を使用すると 0.125 秒かかります。 0.016秒。したがって、文字の操作では結合の方が + よりも高速であるため、+ の代わりに結合を使用するようにしてください。
リスト 7. + 接続文字列の代わりに join を使用する
コードをコピーします コードは次のとおりです。

from time import time
t = time()
s = ""
list = ['a','b','b','d','e','f','g ',' h','i','j','k','l','m','n']
範囲 (10000) の i の場合:
リスト内の substr の場合:
s+ = substr
print "合計実行時間:"
print time()-t

次も避けてください:
コードをコピー コードは次のとおりです:

s = ""
for x in list:
s += func(x)

代わりに、次を使用します:
コードをコピーします コードは次のとおりです:

slist = [func(elt) for elt in somelist]
s = "".join(slist)

1. 正規表現または組み込み関数を使用して文字列を処理できる場合は、組み込み関数を選択します。 str.isalpha()、str.isdigital()、str.startswith(('x', 'yz'))、str.endswith(('x', 'yz')) など
2. 操作を実行します。文字の書式設定は、連続して直接読み取るよりも速いため、
を使用してコード をコピーします。 コードは次のとおりです。
out = " %s%s% s%s" % (head、prologue、query、tail)
を避けてください。
コードをコピー コードは次のとおりです。次のように:
out = "" + head + prologue + query + tail + ""
リスト内包表記とジェネレーター式 (ジェネレーター式) を使用します。
リスト内包表記は、再構築するよりも優れています。ループ 新しいリストはより効率的であるため、この機能を利用して操作の効率を向上させることができます。
コードをコピー コードは次のとおりです:

from time import time
t = time()
list = [ 'a','b','is','python','jason','hello','hill','with','phone','test',
'dfdf', 'apple' ,'pdf','ind','basic','none','baecr','var','bana','dd','wrd']
total=[]
for i in range (1000000):
for w in list:
total.append(w)
print "合計実行時間:"
print time()-t

リスト内包表記を使用します:
コードをコピーします コードは次のとおりです:

範囲 (1000000) の i:
a = [リスト内の w の w]

上述代码直接运行大概需要 17s,而改为使用列表解析后 ,运行时间缩短为 9.29s。将近提高了一半。生成器表达式则是在 2.4 中引入的新内容,语法和列表解析类似,但是在大数据量处理时,生成器表达式的优势较为明显,它并不创建一个列表,只是返回一个生成器,因此效率较高。在上 述例子上中代码 a = [w for w in list] 修改为 a = (w for w in list),运行时间进一步减少,缩短约为 2.98s。
其他优化技巧
1.如果需要交换两个变量的值使用 a,b=b,a 而不是借助中间变量 t=a;a=b;b=t;
复制代码 代码如下:

>>> from timeit import Timer
>>> Timer("t=a;a=b;b=t","a=1;b=2").timeit()
0.25154118749729365
>>> Timer("a,b=b,a","a=1;b=2").timeit()
0.17156677734181258
>>>

1.在循环的时候使用 xrange 而不是 range;使用 xrange 可以节省大量的系统内存,因为 xrange() 在序列中每次调用只产生一个整数元素。而 range() 將直接返回完整的元素列表,用于循环时会有不必要的开销。在 python3 中 xrange 不再存在,里面 range 提供一个可以遍历任意长度的范围的 iterator。
2.使用局部变量,避免"global" 关键字。python 访问局部变量会比全局变量要快得多,因 此可以利用这一特性提升性能。
3.if done is not None 比语句 if done != None 更快,读者可以自行验证;
4.在耗时较多的循环中,可以把函数的调用改为内联的方式;
5.使用级联比较 "x < y < z" 而不是 "x < y and y < z";
6.while 1 要比 while True 更快(当然后者的可读性更好);
7.build in 函数通常较快,add(a,b) 要优于 a+b。
定位程序性能瓶颈
对代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位,python 内置了丰富的性能分析工具,如 profile,cProfile 与 hotshot 等。其中 Profiler 是 python 自带的一组程序,能够描述程序运行时候的性能,并提供各种统计帮助用户定位程序的性能瓶颈。Python 标准模块提供三种 profilers:cProfile,profile 以及 hotshot。
profile 的使用非常简单,只需要在使用之前进行 import 即可。具体实例如下:

清单 8. 使用 profile 进行性能分析
复制代码 代码如下:


import profile
def profileTest():
Total =1;
for i in range(10):
Total=Total*(i+1)
print Total
return Total
if __name__ == "__main__":
profile.run("profileTest()")


程序的运行结果如下:
图 1. 性能分析结果

其中输出每列的具体解释如下:

•ncalls:表示函数调用的次数;
•tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间;
•percall:(第一个 percall)等于 tottime/ncalls;
•cumtime:表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间;
•percall:(第二个 percall)即函数运行一次的平均时间,等于 cumtime/ncalls;
•filename:lineno(function):每个函数调用的具体信息;
如果需要将输出以日志的形式保存,只需要在调用的时候加入另外一个参数。如 profile.run("profileTest()","testprof")。

对于 profile 的剖析数据,如果以二进制文件的时候保存结果的时候,可以通过 pstats 模块进行文本报表分析,它支持多种形式的报表输出,是文本界面下一个较为实用的工具。使用非常简单:
复制代码 代码如下:


import pstats
p = pstats.Stats('testprof')
p.sort_stats("name").print_stats()

其中 sort_stats() 方法能够对剖分数据进行排序, 可以接受多个排序字段,如 sort_stats('name', 'file') 将首先按照函数名称进行排序,然后再按照文件名进行排序。常见的排序字段有 calls( 被调用的次数 ),time(函数内部运行时间),cumulative(运行的总时间)等。此外 pstats 也提供了命令行交互工具,执行 python – m pstats 后可以通过 help 了解更多使用方式。

大規模なアプリケーションの場合、Gprof2Dot、visualpytune、KCacheGrind などの一般的な視覚化ツールを使用してパフォーマンス分析結果をグラフィカルに表示できれば、非常に実用的かつ直感的になります。読者は関連する公式 Web サイトを自分で確認できます。この記事では詳しく説明しません。

Python パフォーマンス最適化ツール

Python のパフォーマンスの最適化には、アルゴリズムの改善と適切なデータ構造の選択に加えて、主要な Python コード部分を C 拡張モジュールに書き換えたり、より最適化されたパフォーマンスを持つインタープリターを選択したりするなど、いくつかの主要なテクノロジも含まれます。この記事では最適化ツールと呼びます。 Python には、Psyco、Pypy、Cython、Pyrex など、多くの最適化ツールが組み込まれています。これらの最適化ツールにはそれぞれ独自の利点があります。このセクションでは、いくつかを選択して紹介します。

サイコ

psyco は、ソース コードを変更せずに特定のパフォーマンスを向上させることができるジャストインタイム コンパイラーであり、操作をわずかに最適化されたマシン コードにコンパイルします。その操作は「ランタイム」、「コンパイル」の 3 つの異なるレベルに分かれています。 「時間」変数と「仮想時間」変数。そして、必要に応じて変数のレベルを上げたり下げたりします。ランタイム変数は、通常の Python インタープリターによって処理される単なる生のバイトコードとオブジェクト構造です。 Psyco が演算をマシン コードにコンパイルすると、コンパイル時変数はマシン レジスタと直接アクセス可能なメモリ位置に表現されます。同時に、Python はコンパイルされたマシン コードを将来の再利用のためにキャッシュできるため、時間を少し節約できます。ただし、Psyco には欠点もあります。現在、psyco は python2.7 でサポートされなくなり、メンテナンスやアップデートも提供されなくなりました。興味のある方は http://psyco.sourceforge.net/

を参照してください。

ピピ

PyPy は「Python で実装された Python」を意味しますが、実際には RPython と呼ばれる Python のサブセットを使用して実装され、Python コードを C、.NET、Java およびその他の言語およびプラットフォーム用のコードに変換できます。 PyPy は、ジャストインタイム (JIT) コンパイラーを統合します。多くのコンパイラやインタプリタとは異なり、Python コードの字句解析や構文ツリーは考慮されません。 Python 言語で記述されているため、Python 言語のコード オブジェクトを直接利用します。コード オブジェクトは Python バイトコードの表現です。つまり、PyPy は Python コードに対応するバイトコードを直接分析し、文字形式またはバイナリ形式でファイルに保存するのではなく、Python ランタイム環境に保存します。現在のバージョンは 1.8 です。Windows に Pypy をインストールするには、まず https://bitbucket.org/pypy/pypy/downloads/pypy-1.8-win32.zip をダウンロードして解凍する必要があります。該当のディレクトリにコピーして解凍し、環境変数のパスに以下のパスを追加することができます。コマンド ラインで pypy を実行します。「MSVCR100.dll が見つからないため、このアプリケーションを開始できませんでした。アプリケーションを再インストールすると、この問題が解決される可能性があります。」というエラーが発生した場合は、Microsoft の公式 Web サイトから VS 2010 ランタイム ライブラリをダウンロードする必要があります。問題を解決してください。具体的なアドレスは http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5555

です。

インストールが成功したら、コマンド ラインで pypy を実行します。出力は次のとおりです。

コードをコピーします コードは次のとおりです。


C:Documents and SettingsAdministrator>pypy
Python 2.7.2 (0e28b379d8b3、2012 年 2 月 9 日、18:31:47)
[PyPy 1.8.0 with MSC v.1500 32 bit] on win32
詳細については、「ヘルプ」、「著作権」、「クレジット」、または「ライセンス」と入力してください。
そして今度はまったく別のことを説明します。「PyPy は広大で、
多数のものが含まれています」。 '
>> ;>>

リスト 5 のループを例として、python と pypy を使用して実行すると、次のような結果が得られます。 🎜>
コードをコピー コードは次のとおりです: C:Documents and SettingsAdministrator デスクトップ docpython>pypy loop.py
合計実行時間:
8.42199993134
C:Documents and SettingsAdministrator デスクトップ docpython>python loop.py
合計実行時間:
106.391000032


pypy を使用してコンパイルして実行することがわかります。プログラムの効率が大幅に向上します。 Cython
Cython は Python で実装された言語で、Python 拡張機能を作成するために使用でき、インポートを通じてロードでき、そのパフォーマンスは Python よりも高速です。 Python 拡張機能 (import math など) を cython にロードしたり、C ライブラリのヘッダー ファイル (「math.h」の :cdef extern など) をロードしたり、Python コードを記述するために使用したりすることもできます。重要な部分を C 拡張モジュールに書き換えます

Linux Cpython のインストール:
ステップ 1: ダウンロード

コードをコピーしますコードは次のとおりです:

[root@v5254085f259 cpython]# wget -N http://cython.org/release/Cython-0.15.1.zip
--2012-04-16 22:08:35-- http://cython.org/release/Cython-0.15.1.zip
cython.org... 128.208.160.197 を解決しています
cython.org|128.208.160.197|:80... に接続しています。
HTTP リクエストが送信され、応答を待っています... 200 OK
長さ: 2200299 (2.1M) [アプリケーション/zip]
保存先: `Cython-0.15.1.zip'
100%[ ======================================>] 2,200,299 1.96M/s in 1.1s
2012-04-16 22:08:37 (1.96 MB/s) - `Cython-0.15.1.zip' が保存されました [2200299/2200299]

ステップ 2: 解凍
コードをコピーします コードは次のとおりです:

[root@v5254085f259 cpython]# unzip -o Cython-0.15.1.zip

ステップ 3: インストール
コードをコピーします コードは次のとおりです:

Python セットアップ.py install

インストールが完了したら、cython を直接入力して以下の内容が表示されればインストール成功です。
コードをコピーします コードは次のとおりです:

[root@v5254085f259 Cython-0.15.1]# cython
Cython (http://cython.org) は、
Cython 言語で記述されたコード用のコンパイラーです。Cython は、Greg Ewing による Pyrex に基づいています。
使用法: cython [options] sourcefile.{pyx,py} 。 ..
オプション:
-V、--version cython コンパイラのバージョン番号を表示
-l、--create-listing エラー メッセージをリスト ファイルに書き込みます
-I、--include- dir 名前付きディレクトリ
内のインクルード ファイルを検索します (複数のインクルード ディレクトリが許可されます)。
-o, --output-file 生成された C ファイルの名前を指定します。
-t, --timestamps 新しいソース ファイルのみをコンパイルします。
-f, --force すべてのソース ファイルをコンパイルします (暗黙の -t をオーバーライドします)
-q, --quit 再帰モードでモジュール名を出力しません
-v, --verbose 冗長にして出力します複数のコンパイルでのファイル名
-p, --embed-positions 指定すると、各
関数定義の Cython ファイル内の位置がその docstring に埋め込まれます。
--cleanup
インターンされたオブジェクトを解放します。 python exit 、メモリ デバッグ用。
レベルは積極性を示し、デフォルトの 0 は何も解放しません。
-w, --working
Cython の作業ディレクトリを設定します (ディレクトリ モジュールが検索されます)
-- gdb cygdb のデバッグ情報を出力します。
-D, --no-docstrings
コンパイルされたモジュールから docstring を削除します。
-a, --annotate
ソースの色付きの HTML バージョンを生成します。 >- -line-directives
.pyx ソースを指す #line ディレクティブを生成します
--cplus
C ファイルではなく C++ を出力します
--embed[=]
ファイルを生成します。 Python インタプリタを組み込む main( ) 関数。
-2 Python-2 構文とコード セマンティクスに基づいてコンパイルします。
-3 Python-3 構文とコード セマンティクスに基づいてコンパイルします。 -fail 最初のエラーでコンパイルを中止します
--warning-error, -Werror すべての警告をエラーにします
--warning-extra, -Wextra 追加の警告を有効にします
-X, --directive =
[,


他のプラットフォームへのインストールについては、ドキュメントを参照してください: http://docs.cython.org/src/quickstart/install.html Cython コードはコンパイルには通常、pyx ファイルを .c ファイルにコンパイルし、次に .c ファイルを .so ファイルにコンパイルするという 2 つの段階が必要です。コンパイルにはさまざまな方法があります:
•コマンド ラインを使用してコンパイルします:
次のテスト コードがあると仮定し、コマンド ラインを使用して .c ファイルにコンパイルします。


コードをコピー コードは次のとおりです。 def sum(int a,int b):
print a +b
[root@v5254085f259 test]# cython sum.pyx
[root@v5254085f259 test]# ls
total 76
4 drwxr-xr-x 2 root root 4096 4月 17 02:45 .
4 drwxr-xr-x 4 ルート root 4096 4 月 16 日 22:20 ..
4 -rw-r--r-- 1 ルート root 35 4 月 17 日 02:45 1
60 -rw -r- -r-- 1 ルート root 55169 Apr 17 02:45 sum.c
4 -rw-r--r-- 1 ルート root 35 Apr 17 02:45 sum.pyx


Linux 上で gcc を使用して .so ファイルにコンパイルします:

コードをコピーします コードは次のとおりです: [root@v5254085f259 test]# gcc -shared -pthread -fPIC -fwrapv -O2
-Wall -fno-strict-aliasing -I/usr/include/python2.4 -o sum.so sum.c
[root@v5254085f259 test]# ls
total 96
4 drwxr-xr-x 2 root root 4096 Apr 17 02:47
4 drwxr-xr-x 4 root root 4096 Apr 16 22: 20 ..
4 - rw-r--r-- 1 ルート root 35 4 月 17 日 02:45 1
60 -rw-r--r-- 1 ルート root 55169 4 月 17 日 02:45 合計。 c
4 -rw- r--r-- 1 ルート root 35 Apr 17 02:45 sum.pyx
20 -rwxr-xr-x 1 ルート root 20307 Apr 17 02:47 sum.so


• distutils を使用して をコンパイルし、setup.py スクリプトを作成します。


コードをコピーします コードは次のとおりです。

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("sum", ["sum.pyx"]) ]
setup(
name = 'sum app',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)
[root@v5254085f259 test]# python setup.py build_ext --inplace
build_ext の実行
sum.pyx を sum.c に変換
「sum」拡張機能を構築
gcc -pthread -fno-strict-aliasing -fPIC -g -O2 - DNDEBUG -g -fwrapv -O3
-Wall -Wstrict-prototypes -fPIC -I/opt/ActivePython-2.7/include/python2.7
-c sum.c -o build/temp.linux-x86_64- 2.7/sum.o
gcc -pthread -shared build/temp.linux-x86_64-2.7/sum.o
-o /root/cpython/test/sum.so

検証が完了したら、Python で使用できるようになります:
复制代 代码如下:

[root@v5254085f259 test]# python
Python 2.7.2 (デフォルト、2011 年 6 月 24 日 11:24:26) ベースの
ActivePython 2.7.2.5 (ActiveState Software Inc.)
[GCC 4.0.2 20051125 (Red Hat 4.0.2) -8)] Linux2 の場合
詳細については、「ヘルプ」、「著作権」、「クレジット」、または「ライセンス」と入力してください。
>>> pyximportをインポートします。 pyximport.install()
>>>輸入合計
>>> sum.sum(1,3)

下で一简单のパフォーマンス比较を実行します:
清单 9. Cython 测试代码
复制代 代码如下:

from time import time
def test(int n):
cdef int a =0
cdef int i
for i in xrange(n):
a+= i
return a
t = time()
test(10000000)
print "合計実行時間:"
print time()- t

测试結果:
复制代代码如下:

[GCC 4.0.2] 20051125 (Red Hat 4.0.2-8)] on linux2
詳細については、「ヘルプ」、「著作権」、「クレジット」、または「ライセンス」と入力してください。
>>> pyximportをインポートします。 pyximport.install()
>>> import ctest
合計実行時間:
0.00714015960693

清单 10. Python 测试代码
复制代 代码如下:

インポート時間から
def test(n):
a =0;
for i in xrange(n):
a+= i
return a
t = time()
test(10000000)
print "合計実行時間:"
print time()-t
[root@v5254085f259 test]# python test.py
合計実行時間:
0.971596002579

上記の比より Cython を使用した速度が確認できます

に続きます。 ここでは、Python の一般的なパフォーマンス向上技術と、ツールを使用してプログラムのパフォーマンス ボトルをどのように決定し、分析するかを検討し、関連するパフォーマンス向上を実行できるツールや説明を提供します。より関係のある方にいくつかの参考にしていただければ幸いです。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート