为什么pyp (python)一行程序这么慢?



我正在尝试将我的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,那么使用简单的别名似乎可以获得实质性的性能增益。

最新更新