Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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 - Fatal编程技术网

Python 试图在列表中查找唯一值的速度较慢的脚本

Python 试图在列表中查找唯一值的速度较慢的脚本,python,Python,我在Python中遇到了一个问题: 如果: 2≤ A.≤ 100和2≤ B≤ 100 我写了以下脚本,但在我的笔记本电脑上速度太慢(甚至不能产生结果): 好吗?为什么速度慢?脚本速度慢且不返回值的原因是您创建了一个无限循环。您需要将a+=1行删除一级,否则,在第一次通过内部之后,循环a将不会再次递增 注释中指出了脚本的一些其他问题,但这正是您遇到的问题的原因。此代码不起作用;这是一个无限循环,因为在循环的每次迭代中,你都不会增加a。在修复该问题后,您仍然无法得到正确答案,因为当b达到101时,您

我在Python中遇到了一个问题: 如果:
2≤ A.≤ 100和
2≤ B≤ 100

我写了以下脚本,但在我的笔记本电脑上速度太慢(甚至不能产生结果):


好吗?为什么速度慢?

脚本速度慢且不返回值的原因是您创建了一个无限循环。您需要将
a+=1
行删除一级,否则,在第一次通过内部
之后,
循环
a
将不会再次递增


注释中指出了脚本的一些其他问题,但这正是您遇到的问题的原因。

此代码不起作用;这是一个无限循环,因为在循环的每次迭代中,你都不会增加
a
。在修复该问题后,您仍然无法得到正确答案,因为当
b
达到
101
时,您从未将
a
重置为2

然后,
List
将只包含
4
,因为您在循环外部将
c
设置为
2**2
,并且从不在循环内部更改它。当你修正它时,它仍然会比实际需要的慢,因为你每次都在阅读整个列表来获得计数,随着它变长,这需要越来越多的时间

如果您只需要知道某个项目是否在列表中,通常应该在
中使用
,而不是
计数
,因为它会在找到该项目后立即停止,但在这个特定的实例中,您无论如何都应该使用
集合
,因为您正在寻找唯一的值。您只需将
添加到集合中,而无需检查项目是否已在集合中

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

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

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

您的代码不好,因为它不能产生正确的结果。正如@grael的评论所指出的那样,在循环中不需要重新计算
c
的值,因此只需要反复计算一个值。正如其他人所指出的,还有其他问题

您的代码速度不快有几个原因

  • 你使用的是暴力手段。用数论和组合数学可以更简单地找到答案。看看每个数在2和100之间的素数分解,并考虑这个数的每个幂的素数分解。你永远不需要计算完整的数字——素数分解就足够了。我会把细节留给你,但这会快得多

  • 您正在运行自己的循环,但使用python的循环速度更快。循环
    a
    b
    ,使用:

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

  • 您使用非常慢的方法来查看是否已经计算了一个数字。您的
    if List.count(c)==0
    必须检查之前的每个数字,以查看是否已看到当前数字。当您已经看到数千个数字时,这将变得非常缓慢。将已经看到的数字保存在一个集合中比保存在列表中要快得多。检查一个数字是否在集合中要比在列表中使用
    count()
    快得多

  • 尝试结合所有这些建议。正如另一个答案所示,仅使用最后两个可能就足够了。

    您做了什么来调试它?您忘记了在循环的每个步骤中重新计算
    c
    的值。它的速度很慢,因为您需要进行大约100000次迭代,其中需要重新计算
    c
    ,检查它是否存在于
    列表中,并在需要时将其添加到其中。这是一个很大的操作。然而,目前还没有更简单的解决办法。
    
    for a in range(2,101):
        for b in range(2,101):
            c = pow(a, b)
            # other code here