我正在尝试将我的perl单行转换为pyp。我的第一次尝试是作为另一个question作为
的答案给了我pyp "mm | p if n==0 else (p[:-2] + [(int(x)%12) for x in p[-2:]]) | mm"
然而,结果却非常缓慢。如果我使用
创建测试文件for j in xrange(50000):
print ",".join(str(i) for i in [random.choice(xrange(1000)) for i in xrange(8)])
然后运行
time (cat testmedium.txt |~/.local/bin/pyp "mm | p if n==0 else (p[:-2] + [(int(x)%12) for x in p[-2:]]) | mm" > /dev/null)
我得到了
real 1m27.889s
user 1m26.941s
sys 0m0.688s
然而perl中的等价物几乎是即时的。
time (cat testmedium.txt |perl -l -a -F',' -p -e'if ($. > 1) { $F[6] %=12; $F[7] %= 12;$_ = join(q{,}, @F[6,7]) }' > /dev/null)
real 0m0.196s
user 0m0.192s
sys 0m0.012s
对于较大的测试文件,差异更为显着。
答案 0 :(得分:4)
此代码......
import sys
for index,line in enumerate(sys.stdin):
if index == 0:
print line
else:
values = line.split(',')
values[-2:] = [str(int(x)%12) for x in values[-2:]]
print ','.join(values)
为我运行一秒钟(使用您使用相同方法生成的测试文件):
$ time (cat test.txt | python foo.py > /dev/null)
real 0m0.363s
user 0m0.339s
sys 0m0.032s
因此,如果您遇到问题,那么pyp
尝试做的事情可能效率低下。
答案 1 :(得分:0)
这是对你的问题@marshall的间接回答。
首先,我想说,对我来说,pyp的最大优势是不必学习另一种语言,而且我通常不会处理大量数据,因此它非常适合我的需求。另外,我知道pyp也有一些速度导向的优化可能会影响你描述的问题。
我想知道pypy是否可以提供更快的pyp版本,所以我为pyp创建了一个别名:
alias 'pl=pypy /usr/bin/pyp'
然后我用pyp和pl
运行这个命令lr | pl "'doc',p, p.replace('e','EEE')+'.xpg' | pp.reverse() | ''.join(p)" | pl "d|u"
其中lr是ls -R + ls -A的别名,只是为了创建一个长递归列表来为操作计时。
对于使用Python 2.7.6的pyp,结果是8.04秒,对于pl别名,结果是4.46秒。对于更大的目录集,它是470和250秒。在此操作期间,Python以一个核心的100%运行,PyPy也是如此。
因此,如果你的系统中有pypy,那么使用简单的别名就可以获得显着的性能提升。