1
ruoyu0088 2014-11-09 11:38:43 +08:00
把你的测试代码和开发环境贴出来看看。什么系统,Python 3.x, python 2.x?
|
2
snail1988 OP 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方法 |
4
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 |
5
ruoyu0088 2014-11-09 12:29:04 +08:00
我记得Python3用"r"模式打开文件的话读入的是Unicode,有一个UTF8转Unicode的过程。
|
6
snail1988 OP |
7
lxyu 2014-11-09 14:07:24 +08:00 via iPhone
这种文件搜索为何不用 grep ack 这种工具呢?
|
8
snail1988 OP @lxyu 我要对文件内容做处理在进行比对,然后做处理,之前用shell grep sed 这些做了个脚本,太慢了改成python快很多
|
9
snail1988 OP 看来Py3的IO确实是因为编码和处理变慢了,下面这篇文章不错
http://dabeaz.blogspot.com/2010/01/reexamining-python-3-text-io.html |