5

同じマシンで python 2.7 と matlab R2010a を何もせずに実行すると、速度が 10 倍変わります

オンラインで調べたところ、同じ順序であると聞きました。Python は for ループ内の if ステートメントと数学演算子のようにさらに遅くなります

私の質問: これは現実ですか? または、それらを同じ速度順にする他の方法がありますか?


ここにpythonコードがあります

import time

start_time = time.time()

for r in xrange(1000):

      for c in xrange(1000):

         continue

elapsed_time = time.time() - start_time

print 'time cost = ',elapsed_time

Output: time cost = 0.0377440452576

ここにmatlabコードがあります

tic

for i = 1:1000

    for j = 1:1000

    end

end

toc

Output: Escaped time is 0.004200 seconds

4

5 に答える 5

9

これが発生する理由は、MATLAB for ループを最適化するJITコンパイラに関連しています。feature accel offと を使用して、JIT アクセラレータを無効/有効にすることができますfeature accel on。アクセラレータを無効にすると、時代は劇的に変化します。

アクセルをオンにした MATLAB:Elapsed time is 0.009407 seconds.

アクセルをオフにした MATLAB:Elapsed time is 0.287955 seconds.

パイソン:time cost = 0.0511920452118

このように、JIT アクセラレータは、お気づきの速度向上を直接引き起こしています。もう 1 つ考慮すべきことがあります。これは、反復インデックスを定義した方法に関連しています。MATLAB と Python のどちらの場合でも、反復子を使用してループを定義しました。MATLAB では、角かっこ ( []) を追加して実際の値を作成し、pythonrangeでは代わりにを使用しますxrange。これらの変更を行うと、

% MATLAB
for i = [1:1000]
    for j = [1:1000]

# python
for r in range(1000):
  for c in range(1000):

時代はなる

アクセルをオンにした MATLAB:Elapsed time is 0.338701 seconds.

アクセルをオフにした MATLAB:Elapsed time is 0.289220 seconds.

パイソン:time cost = 0.0606048107147

最後の考慮事項は、ループに簡単な計算を追加するかどうかです。すなわちt=t+1。それから時代は

アクセルをオンにした MATLAB:Elapsed time is 1.340830 seconds.

アクセルオフのMATLAB:(Elapsed time is 0.905956 seconds.はいオフの方が速かった)

パイソン:time cost = 0.147221088409

ここでの教訓は、for ループの計算速度は、状況に応じて、非常に単純なループと同等であるということだと思います。ただし、python には他にも数値ツールがあり、大幅に高速化できます。これまでのところ、numpy と PyPy が取り上げられています。

于 2013-06-21T19:29:46.737 に答える
3

基本的な Python 実装である CPython は、超高速であることを意図していません。効率的な matlab スタイルの数値操作が必要な場合は、PyPy や Cython など、高速な作業用に設計された Pythonnumpyパッケージまたは実装を使用してください。(もちろん非常に高速な C で Python 拡張機能を作成することも考えられる解決策ですが、その場合は、単に使用numpyして労力を節約することもできます。)

于 2013-06-21T19:32:58.967 に答える
2

Python の実行パフォーマンスが本当に重要な場合は、PyPyを検討してください。

私はあなたのテストをしました:

import time
for a in range(10):
    start_time = time.time()
    for r in xrange(1000):
        for c in xrange(1000):
            continue

    elapsed_time = time.time()-start_time
    print elapsed_time

標準の Python 2.7.3 では、次のようになります。

0.0311839580536
0.0310959815979
0.0309510231018
0.0306520462036
0.0302460193634
0.0324130058289
0.0308878421783
0.0307397842407
0.0304911136627
0.0307500362396

一方、PyPy 1.9.0 (Python 2.7.2 に対応) を使用すると、次のようになります。

0.00921821594238
0.0115230083466
0.00851202011108
0.00808095932007
0.00496387481689
0.00499391555786
0.00508499145508
0.00618195533752
0.005126953125
0.00482988357544

PyPy の高速化は本当に驚くべきものであり、その JIT コンパイラーの最適化がそのコストを上回ったときに実際に目に見えるようになります。それが、追加の for ループを導入した理由でもあります。この例では、コードを変更する必要はまったくありませんでした。

于 2013-06-21T19:23:57.497 に答える