我在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
好吗?它为什么慢?
答案 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
的值,所以你只是一遍又一遍地计算一个值。还有其他问题,正如其他人所指出的那样。
由于多种原因,您的代码速度不快。
您正在使用强力方法。通过使用数论和组合学可以更简单地找到答案。查看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()
快得多。尝试结合所有这些建议。正如另一个答案所示,只使用最后两个可能就足够了。