python与grep[英] python vs. grep

问题描述

我读过关于生成器的精彩论文:
http://www.dabeaz.com/generators/index.html

作者说写linux常用工具的类比很容易
如 awk,grep 等.他说性能可能会更好.

但是我在编写性能 grep 模拟时遇到了一些问题.
这是我的剧本:

重新导入
pat = re.compile("sometext")

f = open("大文件",''r'')

flines = (line for line in f if pat.search(line))
c=0
对于 flines 中的 x:
c+=1
打印c

bash:
grep "某些文本"大文件 |wc -l

Python 代码在 Windows 上慢 3-4 倍.我记得在 linux
同样的情况……

在打开时缓冲甚至会增加时间.

是否可以提高文件读取性能?

推荐答案

2008 年 5 月 6 日星期二下午 1:42,Anton Slesarev <sl************@gmail.com 写道:
是否可以提高文件读取性能?
不知道,但这部分:
flines = (line for line in f if pat.search(line))
c=0
对于 flines 中的 x:
c+=1
打印 c
可以改写为:

print sum(1 for line in f if pat.search(line))

Anton Slesarev <sl************@gmail.comwrites:
f = open("大文件",''r'')

flines = (line for line in f if pat.search(line))
c=0
对于 flines 中的 x:
c+=1
打印 c
不使用生成器表达式会更简单(并且可能更快):

search = re.compile(''sometext'').search

c = 0
for line in open(''bigfile''):
如果搜索(行):
c += 1

可能更快(因为名称查找次数减少了),使用
itertools.ifilter:

从 itertools 导入 ifilter

c = 0
对于 ifilter 中的行(搜索,''bigfile''):
c += 1
如果 ''sometext'' 只是文本(没有正则表达式通配符),那么更简单:

....
对于...中的行:
如果 ''sometext'' 在行中:
c += 1

我不相信你会用 Python 轻松击败 grep + wc.

也许更快?

sum(bool(search(line)) for line in open(''bigfile''))
sum(1 for line in ifilter(search, open(''bigfile'')))

....等等...

这一切都是未经测试的!
--
Arnaud

2008 年 5 月 6 日,Anton Slesarev <sl************@gmail.com>:
但是我在编写性能 grep 模拟时遇到了一些问题.
[...]
Python 代码在 Windows 上慢 3-4 倍.我记得在 linux
同样的情况……

在打开时缓冲甚至会增加时间.

是否可以提高文件读取性能?
最好的建议是不要试图击败 grep,但如果你真的
想,这是正确的地方;)

这是我的代码:

本文地址:https://www.itbaoku.cn/post/1050825.html