为什么我的程序比使用python内置函数的程序更快?

时间:2015-07-09 03:56:12

标签: python list time

好的,我正在对coderbyte进行拼图,这就是这个难题:

让函数SimpleMode(arr)获取存储在arr中的数字数组,并返回最常出现的数字(模式)。例如:如果arr包含[10,4,5,2,4],则输出应为4.如果有多个模式,则返回首先出现在阵列中的模式(即[5,10,10,6] ,5]应该返回5,因为它首先出现)。如果没有模式返回-1。该数组不会为空。

所以这是我的计划:

import time
from random import randrange

def SimpleMode(arr): 
  bestMode=0
  numTimes=0
  for x in range(len(arr)):
    if len(arr)>0:
      currentNum=arr[0]
      currentMode=0
      while currentNum in arr:
        currentMode+=1
        arr.remove(currentNum)
      if currentMode>numTimes:
        numTimes=currentMode
        bestMode=currentNum
    else: break
  if numTimes==1: bestMode=-1
  return bestMode

start_time = time.time()
numbers = [randrange(1,10) for x in range(0, 1000)]
print(SimpleMode(numbers))
print("--- %s seconds ---" % (time.time() - start_time))

这是一个更简单的程序,其他人写道:

import time
from random import randrange

def SimpleMode(arr): 

  best = -1
  best_count = 1

  for c in arr:
    if arr.count(c) > best_count:
      best = c
      best_count = arr.count(c)

  return best

start_time = time.time()
numbers = [randrange(1,10) for x in range(0, 1000)]
print(SimpleMode(numbers))
print("--- %s seconds ---" % (time.time() - start_time))

现在我知道使用我的计时方法,这取决于我的CPU在做什么以及诸如此类,所以这不是最准确的方法,但是把我放在一边的是我的计算机用了0.012000秒来运行我的程序但是运行第二个程序需要0.025001秒。

现在这里是我困惑的地方。我自己编写的程序花费的时间不到其他程序使用内置python函数的时间的一半,并且只有一个for循环,而我的程序在for循环中有一个while循环。

任何人都可以对此提供任何见解吗?

2 个答案:

答案 0 :(得分:4)

第二个程序每次迭代调用count两次,并且因为count是O(n)(也就是说,它必须遍历整个数组,就像for循环一样),时间很快加起来。

那就是说,你的程序可以进一步减少:

import collections

def SimpleMode(arr):
    if not arr:
        return -1
    counts = collections.Counter(arr)
    return max(counts, key=lambda k: (counts[k], -arr.index(k)))

此外,请注意您的初始程序会改变其输入(由于.remove调用,它会有效地销毁您传递的列表,如果您在调用后想要对arr执行任何操作,这将会很糟糕SimpleMode)。

最后,在Python中,[1, 2, 3, 4]构造称为列表,而不是数组。在Python中存在一种叫做数组的东西,而且这个(大部分时间它都是NumPy数组,但它也可以是来自{{1}的数组stdlib中的模块。)

答案 1 :(得分:0)

您的代码一次性完成所有内容 其他代码包含arr.count()中隐藏的嵌套循环。