有没有办法让这个功能更快

Is there any way to make this function faster

我正在编写这个函数,首先我使用了循环。循环需要时间来尝试列表理解。它没有用。此功能允许 10 秒。请检查一下。函数 return 对比率为 5% 或以上的公司进行排序。

def mostActive(customers):
    # Write your code here
    tot = len(customers)
    set_cust = set(customers)
    cust_dict = {i: customers.count(i)/tot for i in set_cust}
    cus_list = [i for i in list(cust_dict) if cust_dict[i] >= 0.05]
    return sorted(cus_list)

示例输入和输出

Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Beta

预期输出:

Alpha
Beta
Omega

这一行需要优化:

cust_dict = {i: customers.count(i)/tot for i in set_cust}

它是客户数量的二次方,因为 customers.count(i) 将为 set_cust 中的每个客户遍历整个 customers 列表。

相反,您可以循环 customers 一次并在字典中跟踪计数器,然后在末尾除以 tot

或者您也可以使用 collections.Counter

from collections import Counter

tot = len(customers)
[k for k, v in Counter(customers).items() if (v / tot >= 0.05)]

另一种 object-oriented 方法:

from collections import Counter


class FreqCounter(Counter):
    def most_common(self, *args, **kwargs):
        total = sum(self.values())
        return list(map(lambda x: (x[0], x[1]/total), super().most_common(*args, **kwargs)))


def most_active(customers):
    most_active_customers = []
    for customer, freq in FreqCounter(customers).most_common():
        if freq < 0.05:
            break
        most_active_customers.append(customer)
    return sorted(most_active_customers)  # Remove sorted if needed in frequency order instead of name order


customers = [
    'Omega', 'Alpha', 'Omega', 'Alpha', 'Omega',
    'Alpha', 'Omega', 'Alpha', 'Omega', 'Alpha',
    'Omega', 'Alpha', 'Omega', 'Alpha', 'Omega',
    'Alpha', 'Omega', 'Alpha', 'Omega', 'Beta',
]
for customer in most_active(customers):
    print(customer)

输出:

Alpha
Beta
Omega

按照说明删除 sorted,输出将是:

Omega
Alpha
Beta