首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使pypy运行得更快的选项

使pypy运行得更快的选项
EN

Stack Overflow用户
提问于 2015-08-02 03:06:15
回答 1查看 415关注 0票数 0

我编写了一个测试代码,以了解pypy如何更好地优化python代码并运行得更快。这是一种非就地快速排序,应该运行的速度足够慢,以发挥作用。简单地将python替换为pypy,结果实际上要慢一些,从16秒到25秒。我搜索了一下,找到了opt选项,但是我找不到将它应用于pypy的方法。我对蟒蛇很陌生,所以请帮帮我。

代码语言:javascript
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-02 11:05:08

不是一个完整的答案,但实际上问题是递归,PyPy并不擅长这个问题。下面是相同的算法,只对较短的子列表( lg)使用递归,对于较长的列表使用迭代。这个版本仍然是递归的,但递归保证仅限于O(log(n))时间,而不是O(n)。现在PyPy的速度快了4-5倍。

请注意,我们不能说这个算法的总时间(在这两个版本中)实际上是O(n log(n)),因为它充满了列表连接,这也需要时间。不能像对待Haskell或Lisp的“con”链表那样对待Python的列表;在Python中,列表是可变大小的数组。

代码语言:javascript
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31768198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档