【问题标题】:Slow processing time of a list列表的处理时间慢
【发布时间】:2016-05-30 17:14:22
【问题描述】:

为什么我的代码如此缓慢(低效)?我需要使用两种方法来记录处理给定大小的列表所需的时间。我有一个search_fastsearch_slow 方法。即使这两个搜索时间之间存在差异。 Search_fast 仍然很慢。我想优化处理时间,而不是让8.99038815498search_fast65.0739619732search_slow。它只需要几分之一秒。我能做些什么?我会永远感激一些提示,因为编码对我来说仍然很新。 :)

from timeit import Timer


def fillList(l, n):
    l.extend(range(1, n + 1))
l = []
fillList(l, 100)

def search_fast(l):
    for item in l:
        if item == 10:
            return True
    return False

def search_slow(l):
    return_value = False
    for item in l:
        if item == 10: 
            return_value = True
    return return_value

t = Timer(lambda: search_fast(l))
print t.timeit()
t = Timer(lambda: search_slow(l))
print t.timeit()

【问题讨论】:

标签: python list for-loop timeit


【解决方案1】:

最快的方法是使用in 运算符,它测试序列中值的成员资格。

if value in some_container:
    …

参考:https://docs.python.org/3/reference/expressions.html#membership-test-operations

更新:另外,如果您经常需要测试成员资格,请考虑使用集合而不是列表。
一些优点和缺点可以在这里找到:https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset

【讨论】:

    【解决方案2】:

    在上面添加以下代码:

    t = Timer(lambda: 10 in l)
    print(t.timeit())
    

    在我的系统上产生以下内容:

    0.6166538814701169
    3.884095008084452
    0.29087270299795875
    >>>
    

    希望这会有所帮助。基本思想是利用底层 C 代码,而不是编写自己的 Python 代码。

    【讨论】:

      【解决方案3】:

      我设法找出导致代码缓慢的原因。将extend 添加到列表中而不是append 是一个简单的错误。

      def fillList(l, n):
          l.**append**(range(1, n + 1))
      l = []
      fillList(l, 100)
      

      现在search_slow时钟在3.91826605797而不是65.0739619732。但我不知道为什么它会如此改变性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-06
        • 2016-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多