0

我正在尝试将我的 perl one-liners 转换为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

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

4

2 回答 2

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是尝试做某事的效率低下。

于 2013-05-05T18:52:47.013 回答
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,则使用简单的别名似乎可以显着提高性能。

于 2014-05-23T02:48:04.143 回答