使pypy运行得更快的选项

时间:2015-08-02 03:06:15

标签: python pypy

我写了一个测试代码,看看pypy如何很好地优化python代码并且运行得更快。这是一种非就地快速排序,并且应该运行缓慢以产生差异。只需将python替换为pypy,结果实际上从16秒减慢到25秒。我搜索了一下,找到opt选项,但我找不到将其应用于pypy的方法。我对python很新,所以请帮助我一点。

import sys

def sqsort(xxs):
    if len(xxs) == 1 or len(xxs) == 0:
        return xxs
    x = xxs[0]
    xs = xxs[1 :]
    l = []
    g = []
    for x2 in xs:
        if x2 < x:
            l.append(x2)
        if x2 >= x:
            g.append(x2)
    return sqsort(l) + [x] + sqsort(g)

sys.setrecursionlimit(30000)
l = list(reversed(range(15000)))
print(l)
print(sqsort(l))

1 个答案:

答案 0 :(得分:1)

不是一个完整的答案,但确实问题是递归,PyPy并不擅长。这里重写了相同的算法,只对较短的子列表(lg)使用递归,对较长的子列表进行迭代。此版本仍然是递归的,但递归保证限制为O(log(n))次,而不是O(n)。它现在在PyPy中快了4-5倍。

请注意,我们无法说这个算法(在任一版本中)的总时间确实是O(n log(n)),因为它充满了列表连接,这也需要时间。你不能像处理Haskell或Lisp&#34; cons&#34;那样处理Python的列表。链式列表;在Python中,列表是可变大小的数组。

def sqsort(xxs):
    left, right = [], []
    while True:
        if len(xxs) == 1 or len(xxs) == 0:
            return left + xxs + right
        x = xxs[0]
        xs = xxs[1 :]
        l = []
        g = []
        for x2 in xs:
            if x2 < x:
                l.append(x2)
            if x2 >= x:
                g.append(x2)
        if len(l) <= len(g):
            left += sqsort(l) + [x]
            xxs = g
        else:
            right = [x] + sqsort(g) + right
            xxs = l

l = list(reversed(range(15000)))
print(l)
print(sqsort(l))