gpt4 book ai didi

python - 为什么node.js读取文件比python快?

转载 作者:太空宇宙 更新时间:2023-11-04 03:05:48 26 4
gpt4 key购买 nike

我正在同步读取的文件 (48KB) 中分析 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

区别在哪里?

  1. 在文件 IO 中或
  2. Python 列表 ds 分配

或者我不是在比较苹果与苹果吗?

编辑:

  1. 将 python 的 readlines() 更新为 read() 以进行更好的比较
  2. 将迭代次数从 500 更改为 1000

目的:

要了解真相,node.js 比 python 慢,比 C 之类的东西慢,如果这么慢,在这个上下文中的哪个地方。

最佳答案

readlines 返回文件中的行列表,因此它必须逐字符读取数据,不断将当前字符与任何换行符进行比较,并不断组合行列表。

这比简单的 file.read() 更复杂,这相当于 Node.js 所做的事情。

此外,Python 脚本计算的长度是行数,而 Node.js 获取的是字符数。

<小时/>

如果您想要更快的速度,请使用 os.open 而不是 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)

在我的机器上os.openopen快了几秒。输出结果如下:

53.68909174999999
58.12600833400029

如您所见,openos.open4.4 秒,尽管随着运行次数的减少,这种差异也随之减少。

此外,您应该尝试调整 os.read 函数的缓冲区大小,因为不同的值可能会给出非常不同的计时:

timings

此处“操作”表示Test_os的单次调用

<小时/>

如果您摆脱字节解码并使用 io.BytesIO 而不是单纯的 bytes 对象,您将获得相当大的加速:

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

因此,现在的最佳结果是每次调用 0.038 秒,而不是 0.052(加速约 37%)。

关于python - 为什么node.js读取文件比python快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41202148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com