慢脚本试图在列表中查找唯一值

时间:2016-09-15 18:13:36

标签: python

我在Python中遇到了问题: 我想知道如果存在多少个UNIQUE const Chance = require('chance'); const chance = new Chance(Date.now() + Math.random()); let randomStr = chance.string({length: 25, pool: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'}); console.log(randomStr); 值:
Math.random()MySql

我编写了以下脚本,但它在我的笔记本电脑上太慢了(甚至没有产生结果):

a**b

好吗?它为什么慢?

3 个答案:

答案 0 :(得分:3)

这段代码不起作用;它是一个无限循环,因为你在循环的每次迭代中都不会增加a。解决之后,您仍然无法获得正确的答案,因为当a到达b时,您永远不会将101重置为2。

然后,List将仅包含4,因为您将循环外的c设置为2 ** 2,并且永远不会在循环内更改它。当你修复 它仍然比它真正需要的慢时,因为你每次都要读取整个列表以获得计数,并且随着它变得更长,这需要更多还有更多的时间。

如果您只需要知道某个项目是否在列表中,您通常应该使用in而不是count,因为它会在找到该项目后立即停止,但在此特定情况下例如,你应该使用set,因为你正在寻找独特的价值观。你可以只add到集合,而不检查项目是否已经在其中。

最后,使用for循环比使用while循环更具可读性。

result = set()
for a in xrange(2, 101):
    for b in xrange(2, 101):
        result.add(a ** b)
print len(result)

这在我的机器上只需不到一秒钟。

答案 1 :(得分:0)

您的脚本速度慢而且没有返回值的原因是您创建了一个无限循环。您需要将a += 1行设置为一个级别,否则,在第一次通过内部while循环后a将不会再次增加。

在评论中已经指出了脚本的一些其他问题,但这是您遇到的问题的原因。

答案 2 :(得分:0)

您的代码不好,因为它不会产生正确的结果。正如@grael的评论指出的那样,你不会在循环中重新计算c的值,所以你只是一遍又一遍地计算一个值。还有其他问题,正如其他人所指出的那样。

由于多种原因,您的代码速度不快。

  1. 您正在使用强力方法。通过使用数论和组合学可以更简单地找到答案。查看2到100之间每个数字的素数因子分解,并考虑该数字的每个幂的素数因子分解。您永远不需要计算完整的数字 - 素数分解就足够了。我会将详细信息留给您,但这会更快。

  2. 你正在滚动你自己的循环,但使用python的速度更快。循环ab

    for a in range(2,101):
        for b in range(2,101):
            c = pow(a, b)
            # other code here
    
  3. 此代码使用该语言的内置功能,应该更快。这也可以避免您的错误,因为它更简单。

    1. 您使用非常慢的方法来查看是否已经计算了一个数字。您的if List.count(c) == 0必须检查之前的每个号码,以查看当前号码是否已被查看。当你已经看到成千上万的数字时,这将变得非常缓慢。将已经看到的数字保存在集合而不是列表中要快得多。检查某个数字是否在一个集合中比在列表中使用count()快得多
    2. 尝试结合所有这些建议。正如另一个答案所示,只使用最后两个可能就足够了。