我正在尝试将我的perl一行程序转换为pyp。我的第一次尝试被善意地给予我作为另一个问题的答案
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
这段代码…
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
试图做的事情效率低下。
这是对你的问题的间接回答@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,那么使用简单的别名似乎可以获得实质性的性能增益。