Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
为什么我的程序比使用python内置函数的程序快?_Python_List_Time - Fatal编程技术网

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

为什么我的程序比使用python内置函数的程序快?,python,list,time,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)

好的,我在做一个关于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循环


有人能对此提供一些见解吗?

您的代码一次完成所有操作。

另一个代码在
arr.count()
中包含隐藏的嵌套循环。您的代码在一次传递中完成所有操作。

另一个代码在
arr.count()中包含隐藏的嵌套循环,第二个程序每次迭代调用
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
调用,如果您想在调用
SimpleMode
后使用
arr
执行任何操作,这将非常糟糕)


最后,在Python中,
[1,2,3,4]
构造称为列表,而不是数组。Python中存在一种称为数组的东西,但不是这样(大多数情况下,它是一个NumPy数组,但也可以是stdlib中
array
模块中的数组)。

第二个程序每次迭代调用
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
调用,如果您想在调用
SimpleMode
后使用
arr
执行任何操作,这将非常糟糕)


最后,在Python中,
[1,2,3,4]
构造被称为列表,而不是数组。Python中存在一种称为数组的东西,但事实并非如此(大多数情况下,它是一个NumPy数组,但也可以是stdlib中
数组
模块中的数组).

仅仅因为某些东西使用内置函数并不意味着如果它使用较差的算法,它会更快。首先,您的循环需要较少的迭代,因为您删除了已计数的元素,因此
len(arr)>0
在您遍历整个数组之前很可能是真的。第二种算法无论如何都会遍历整个数组,因此根据数组的不同,一种算法可能会以另一种方式出现。您是否尝试过像
[1,2,3,4,5,6,…]
这样的数组?@Amber我在哪里可以找到count()的算法使用?@Evert是的,我使用的原始列表是数字=[x代表范围内的x(0,1000)],结果是相同的。仅仅因为某些东西使用内置函数并不意味着如果使用较差的算法,它会更快。首先,你的循环需要更少的迭代,因为你删除了已经计数的元素,因此
len(arr)>0
在您遍历整个数组之前很可能是真的。第二种算法无论如何都会遍历整个数组,因此根据数组的不同,一种算法可能会以另一种方式出现。您是否尝试过像
[1,2,3,4,5,6,…]
这样的数组?@Amber我在哪里可以找到count()的算法使用?@Evert是的,我使用的原始列表是数字=[x代表范围(0,1000)内的x],结果是一样的。哦,我明白了。他可能只是计算了计数(c)进入for循环后,将其设置为一个变量,然后使用该变量。谢谢!我也不确定lambda是如何工作的,但我会研究它。lambda只是匿名函数。我的程序的诀窍在于
key
参数to
max
如何工作(这与
sort
的-lookin相同)是的,我知道它被称为列表,只是它提供了六种不同语言的挑战,在大多数语言中,它被称为数组。虽然它可能对其他语言有帮助。哦,我明白了。他可能只是计算了计数(c)进入for循环后,将其设置为一个变量,然后使用该变量。谢谢!我也不确定lambda是如何工作的,但我会研究它。lambda只是匿名函数。我的程序的诀窍在于
key
参数to
max
如何工作(这与
sort
的-lookin相同)是的,我知道它被称为列表,它只是在六种不同的语言中提供了挑战,在大多数语言中它被称为数组。虽然它可能对其他语言有帮助。在我看来,OP的代码在arr
arr.remove()中的
currentNum中也包含隐藏循环
但是
arr.remove()
每次都会使列表缩短大约100个项目,这可能会产生更大的影响。在我看来,OP的代码也