python - 如何优化 100000 次迭代的 python 循环?

标签 python python-3.x optimization

我是 python 的新手,我正在尝试编写一个函数,其描述如下: 我有一个整数列表。从这个列表中,我必须找到频率最高的项目并将其打印出来。 这看起来很简单,除非我有一个限制,即函数必须在 10 秒内完成执行并且应该消耗内存<512 MB。对于较短的列表长度,我的函数工作正常,但对于长度为 100000 的列表,它会失败。我无法优化代码。 我有 2 个相同的实现:

实现#1

def returnMaxFrequency(ar):
    freqList = []
    for val in ar:
        freq = ar.count(val)
        freqList.append(freq)
    return(max(freqList))

实现#2

def returnMaxFrequency(ar):   
    freqDict = {x:ar.count(x) for x in ar}   
    maxFreq = max(freqDict.values())
    return maxFreq

例如

if ar = [3 2 1 3]
o/p: 2

在这里不能使用 NumPy。 (不能使用外包)

最佳答案

最简单(并且相当快)的可能是内置的 Counter:

from collections import Counter
winner = Counter(ar).most_common(1)[0]

this article 中给出了一种更快的方法(不使用额外内存,但会破坏原始数组) ,复制在这里:

# Python program to find the maximum repeating number 

# Returns maximum repeating element in arr[0..n-1]. 
# The array elements are in range from 0 to k-1 
def maxRepeating(arr, n,  k): 

    # Iterate though input array, for every element 
    # arr[i], increment arr[arr[i]%k] by k 
    for i in range(0,  n): 
        arr[arr[i]%k] += k 

    # Find index of the maximum repeating element 
    max = arr[0] 
    result = 0
    for i in range(1, n): 

        if arr[i] > max: 
            max = arr[i] 
            result = i 

    # Uncomment this code to get the original array back 
    #for i in range(0, n): 
    #    arr[i] = arr[i]%k 

    # Return index of the maximum element 
    return result 

(此代码的部分内容可以替换为性能更高的替代项,特别是使用 max 函数而不是第二个循环。)

关于python - 如何优化 100000 次迭代的 python 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58517020/

相关文章:

c++ - C/C++编译器反馈优化

python - 如何使用 Python 从 GitHub 下载文件

python - emacs 在使用 # -*- 编码 : ASCII -*- 保存 python 代码之前不断询问

Python:如何根据对象的 id 找到两个列表之间的交集?

python输入提示字符串长度

Mysql 组内随机项和组内计数项

python - scipy.optimize.minimize(method='trust-constr') 不会在 xtol 条件下终止

python - 使用递归分解数量

python - 如何从python中的unicode列表中删除特定元素

php - MySQL:连接(2 个表)与单个查询(1 个表)