为什么pyp(python)单行如此慢?

时间:2013-05-05 18:29:34

标签: python performance pyp

我正在尝试将我的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

对于较大的测试文件,差异更为显着。

2 个答案:

答案 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,那么使用简单的别名就可以获得显着的性能提升。

相关问题