【发布时间】:2020-08-19 19:33:36
【问题描述】:
通常,对于常规的简单 python 代码,使用 pypy 会更快。但是,当我读取文件并只是拆分字符串并执行非常简单的逻辑时,它怎么会比普通的python慢得多。
以下代码供参考。
首先让我们使用下面的代码创建一个假文件:
NUM_ROWS = 10000000
FILENAME = "testing.txt"
def create_file():
data = []
for x in range(NUM_ROWS):
data.append("AA BB CC DD EE FF GG HH II JJ KK LL MM NN OO\n")
with open(FILENAME, "w") as f:
for d in data:
f.write(d)
f.close()
这只是创建了一个名为 testing.txt 的文件。
然后我们有一个sample.py:
import datetime
FILENAME = "testing.txt"
start = datetime.datetime.now()
with open(FILENAME) as f:
for i, line in enumerate(f):
data = line.split(" ")
if data[0] != "AA":
print(i, line)
print(datetime.datetime.now() - start)
执行C:\pypy3.6-v7.3.1-win32\pypy3.exe sample.py 需要42s 而python sample.py 只需要18s
我在 Windows 10 机器上使用 python3.7。有没有办法使用pypy来加速像上面这样一个简单的脚本?是不是我用错了?
---------更新:
显然它是“读取”或遍历 pypy 中速度较慢的文件。
以 sample.py 为:
import datetime
FILENAME = "testing.txt"
start = datetime.datetime.now()
with open(FILENAME, "r") as f:
for line in f:
pass
print(datetime.datetime.now() - start)
我尝试使用截至 20200818 的最新 pypy3 版本。这是我对上面简单代码的发现(只是逐行迭代具有 1000 万行的文件)。在 Windows 中,常规 python (3.8) 需要 2.3 秒才能执行上述代码,而使用 pypy3 则需要非常慢的 30 秒。在 Ubuntu 中,常规 python 需要 1.2 秒,而使用 pypy3 需要 3.4 秒。 linux版本肯定比较好接受,但是windows肯定需要下功夫
有没有办法使用 pypy for windows 加快读取/迭代文件的速度?
【问题讨论】:
-
抱歉忘记了'\n',我更新了我的问题。无论哪种方式,pypy 仍然较慢
-
我建议让测试更具体。您的示例是从文件中读取,拆分一个短字符串并且可能永远不会打印任何内容?也许只是读取文件作为一个例子。另一个只是拆分字符串。
timeit也很有用。 -
打印与否并不重要。只要两个测试相同。我的意思是,为什么 pypy 比 python 慢,通常情况相反。将尝试进一步分析
-
试试
if not line.startswith("AA "):? -
使测试更加集中的原因是它可以让您了解实际上什么更慢。这也将有助于人们更好地了解 pypy 的工作原理。
标签: python performance pypy