Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么pyp(python)一行程序这么慢?_Python_Performance_Pyp - Fatal编程技术网

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

为什么pyp(python)一行程序这么慢?,python,performance,pyp,Python,Performance,Pyp,我正在尝试将perl一行程序转换为。我的第一次尝试被善意地给予了我,作为对另一次尝试的回答 然而,事实证明,这是惊人的缓慢。如果我使用 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[:

我正在尝试将perl一行程序转换为。我的第一次尝试被善意地给予了我,作为对另一次尝试的回答

然而,事实证明,这是惊人的缓慢。如果我使用

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)
我明白了

然而,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)
在一秒钟内为我运行(使用与您使用的相同方法生成的测试文件):

因此,如果您遇到问题,可能是pyp试图做的事情效率低下。

此代码

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)
在一秒钟内为我运行(使用与您使用的相同方法生成的测试文件):


因此,如果您遇到问题,可能是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和PyPy一样在一个核心上100%运行


因此,如果您的系统上安装了pypy,那么使用一个简单的别名似乎可以获得可观的性能提升。

这是对您的问题@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和PyPy一样在一个核心上100%运行


因此,如果您的系统上有pypy,那么使用一个简单的别名似乎可以获得可观的性能提升。

PErl和python的解释器的工作方式不同。其中一种快速的方法可能是另一种最糟糕的方法。如果你告诉我们你想要实现什么,我们可能会提供一个快速的pythonic版本。@Bakuriu我认为pyp代码一定做了一些奇怪的事情,因为它还使用了大量内存(728MB?),我希望它能在运行中处理这些行。目标基本上是输入逗号分隔的数值,并以相同的格式输出,除了每行中有两个数字给定模12。链接的问题有一些更详细的细节。您是否尝试分析类似于
pyp“mm | mm”
,以检查它是否是pyp本身使用“管道”花费时间?我还想知道,将
(int(x)%12)
更改为
str(int(x)%12)
pyp
中是否有任何效果。然而
python-c“进口系统;在sys.stdin中为x打印“\n”.join(“,”。join(x.split(“,”))“result.txt
没有。因此,是的,
pyp
。PErl和python的解释器的工作方式肯定不一样。其中一种快速的方法可能是另一种最糟糕的方法。如果你告诉我们你想要实现什么,我们可能会提供一个快速的pythonic版本。@Bakuriu我认为pyp代码一定做了一些奇怪的事情,因为它还使用了大量内存(728MB?),我希望它能在运行中处理这些行。目标基本上是输入逗号分隔的数值,并以相同的格式输出,除了每行中有两个数字给定模12。链接的问题有一些更详细的细节。您是否尝试分析类似于
pyp“mm | mm”
,以检查它是否是pyp本身使用“管道”花费时间?我还想知道,将
(int(x)%12)
更改为
str(int(x)%12)
pyp
中是否有任何效果。然而
python-c“进口系统;在sys.stdin中为x打印“\n”.join(“,”。join(x.split(“,”))“result.txt
没有。因此,是的,在
pyp
中肯定有一些东西。同时创建一个新的
列表
,就像在
pyp
版本中一样,不会改变太多的计时,所以这不是问题。我认为这只是pyp中的一个设计缺陷。目前它似乎不适合处理大文件。同时创建一个新的
列表
,就像在
pyp
版本中一样,不会改变很多时间,所以这不是问题。我认为这只是pyp中的一个设计缺陷。目前似乎不适合处理大文件。