我对mathmax的解决方案的问题是,它在寻找5000到5200之间的质数时做了所有的工作,只选择其中一个并放弃其余部分。可能更有效的方法是随机选择5000到5200之间的唯一数字,直到找到第一个质数:
import random
minimum = 5000
maximum = 5200
next((x for x in random.sample(range(minimum, maximum), maximum - minimum) if not [t for t in range(2, x) if not x % t]), None)
这是快了大约18倍。如果我们在素数测试方面再聪明一些,可以再获得18倍的改进:
next((x for x in random.sample(range(minimum, maximum), maximum - minimum) if not [t for t in [2] + list(range(3, int(x**0.5) + 1, 2)) if not x % t]), None)
请注意,使用
random.sample()
的原因是它返回结果,而不像
random.shuffle()
在原列表上进行操作。如果您更喜欢
random.shuffle()
,并且不想在表达式中重复包含数字,您可以尝试以下方法:
next((x for x in (lambda y: random.shuffle(y) or y)(list(range(5000, 5200))) if not [t for t in range(2, x) if not x % t]), None)