2016-12-17 6 views
0

私はnode.jsとファイル(48KB)のpythonとの同期をとってプロファイリングしています。node.jsがファイルの読み込み時にpythonより速いのはなぜですか?

Node.jsのコード

var fs = require('fs'); 
var stime = new Date().getTime()/1000; 

for (var i=0; i<1000; i++){ 
    var content = fs.readFileSync('npm-debug.log'); 
} 

console.log("Total time took is: " + ((new Date().getTime()/1000) - stime)); 

Pythonのコードは次のよう

import time 
stime = time.time() 
for i in range(1000): 
    with open('npm-debug.log', mode='r') as infile: 
     ax = infile.read(); 

print("Total time is: " + str(time.time() - stime)); 

タイミングは以下のとおりです。

$ python test.py 
Total time is: 0.5195660591125488 

$ node test.js 
Total time took is: 0.25799989700317383 

どこに違いがありますか?ファイルIOで

  1. または
  2. PythonのリストのDS割り当て

または私はリンゴにリンゴを比較していないのですか?

EDIT:

  1. 更新Pythonのreadlines()(読んで)良い比較のために
  2. は500

目的から1000年までの反復を変更

node.jsの真実を理解するにはPythonがCよりも遅いこのような状況でどのような場所にいるのかが遅い場合、

+1

これは、正確にリンゴとリンゴの比較ではありません。 node.jsでは、ファイル全体を一度に読むために最適化された関数を呼び出しています。 Pythonでは、ファイルを1行ずつ処理しています。また同じファイルを何度も読んでいるのは、ファイルが最初に読み込まれた後にOSによってキャッシュされるため、実際にファイルI/Oをテストすることではありません。一般的な結論を導き出すために、全体的にみても、驚くほどの比較があります。 – jfriend00

+0

@ jfriend00ねえ、あなたのコメントが理にかなっていました。そして私はinfile.read()で試しました。それでもオーバーヘッドは2倍です(0.28 python対0.15ノード)。ノードファイルの読み込み機能が最適化されている可能性があります – user3151330

+0

結論:そのような比較のための質問からのテストは「代表」ではありません – RomanPerekhrest

答えて

4

readlines戻りファイルの行のリストを、それは常に改行文字のいずれかに現在の文字を比較し、charでデータのcharを読み込み、行のリストを構成維持しなければなりません。

これは単純なfile.read()よりも複雑です。これはNode.jsの機能と同等です。

また、Pythonスクリプトで計算される長さは行数で、Node.jsは文字数です。あなたも、もっとスピードが必要な場合


os.open代わりのopen使用:私のマシン上でos.open

import os, time 


def Test_os(n): 
    for x in range(n): 
     f = os.open('Speed test.py', os.O_RDONLY) 
     data = "" 
     t = os.read(f, 1048576).decode('utf8') 
     while t: 
      data += t 
      t = os.read(f, 1048576).decode('utf8') 
     os.close(f) 

def Test_open(n): 
    for x in range(n): 
     with open('Speed test.py') as f: 
      data = f.read() 

s = time.monotonic() 
Test_os(500000) 
print(time.monotonic() - s) 

s = time.monotonic() 
Test_open(500000) 
print(time.monotonic() - s) 

は数秒速くopenを超えています。次のように出力されている:

53.68909174999999 
58.12600833400029 

あなたが見ることができるように実行の数が減少するようなので、この差はないものの、openは、os.openより遅い4.4秒です。

また、あなたに異なる値が非常に異なるタイミング与える可能性がありos.read機能のバッファサイズを微調整してみてくださいする必要があります

timings

をここで「操作」Test_osから単一の呼び出しを意味します。したがって

def Test_os(n, buf): 
    for x in range(n): 
     f = os.open('test.txt', os.O_RDONLY) 
     data = io.BytesIO() 
     while data.write(os.read(f, buf)): 
      ... 
     os.close(f) 

speedup

は、最良の結果は次のとおりです。


あなたがバイトデコーディングを取り除き、代わりに単なるbytesオブジェクトのio.BytesIOを使用して取得する場合は、かなりのスピードアップを取得します0.052の代わりに0.038秒を呼び出します(〜37%のスピードアップ)。

関連する問題