Python 3 的 open()函数比 Python 2 中的慢很多,有没有办法优化

2014-11-09 11:36:33 +08:00
 snail1988
Python 3中的open()应该是完全用Python实现的,速度和Python 2.5+ 中的io.open()相似,实现应该是相同的。
我实测远比Python 2的open()慢很多,我的程序有大量io操作,有没有办法提高效率?
大家有没有类似的问题?
6554 次点击
所在节点    问与答
9 条回复
ruoyu0088
2014-11-09 11:38:43 +08:00
把你的测试代码和开发环境贴出来看看。什么系统,Python 3.x, python 2.x?
snail1988
2014-11-09 11:57:43 +08:00
OSX 10.10/10.9.5 / Ubuntn 14.04 LTS
Python 3.4.2/3.4 2.7.6/2.7.8

代码片段
def searchCrash(file):
try:
with open(file, 'r') as f:
global count
for line in f:
if 'StackTrace' in line:
count = count + 1
except Exception as e:
# raise e
pass
finally:
pass


def traverseFile(rootDir):
for lists in os.listdir(rootDir):
path = os.path.join(rootDir, lists)
if os.path.isfile(path):
searchCrash(path)


我在一个2000个文件 总计4GB的目录上调用 traverseFile方法
snail1988
2014-11-09 11:59:03 +08:00
@ruoyu0088 每个文件大约2-3M,纯文本UTF8编码
imn1
2014-11-09 12:25:39 +08:00
请给出2.x和3.x的cProfile对比

1.如果每文件只有2~3M,我是不会逐行搜索,而是直接全文件搜索
2.py而文件路径仅仅是个字符串,用字符串的join要比 os.path.join 快
3.open指定encoding参数比较好,如果不纯粹是ASCII字符,你这段代码应该不少except
4.searchCrash没有返回值,却用了global,不如把count返回,避免使用global
ruoyu0088
2014-11-09 12:29:04 +08:00
我记得Python3用"r"模式打开文件的话读入的是Unicode,有一个UTF8转Unicode的过程。
snail1988
2014-11-09 12:35:27 +08:00
@imn1
@ruoyu0088
谢谢两位,我以前没接触过python开发,这次是有些log要分析,所以使用 python处理下数据,开始是在Mac自带的py2环境处理,后来想试试py3会不会更快,结果比较意外

我这2000个文件一个异常也没有,我逐行搜索是因为我的log以行为单位,所以就用了read line,我试试全文搜索的效率
lxyu
2014-11-09 14:07:24 +08:00
这种文件搜索为何不用 grep ack 这种工具呢?
snail1988
2014-11-09 14:21:55 +08:00
@lxyu 我要对文件内容做处理在进行比对,然后做处理,之前用shell grep sed 这些做了个脚本,太慢了改成python快很多
snail1988
2014-11-09 19:00:03 +08:00
看来Py3的IO确实是因为编码和处理变慢了,下面这篇文章不错
http://dabeaz.blogspot.com/2010/01/reexamining-python-3-text-io.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/145080

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX