我试图解决Project Euler's problem #35加快字符串分割和拼接
的数量,197,被称为圆形素因的数字所有旋转:197,971,719,本身就是黄金。
一百万以下有多少个圆形素数?
这是我的解决方案:
import numpy as np
def problem(n=100):
circulars = np.array([], np.int32)
p = np.array(sieveOfAtkin(n), np.int32)
for prime in p:
prime_str = str(prime)
is_circular = True
for i in xrange(len(prime_str)):
m = int(prime_str[i:]+prime_str[:i])
if not m in p:
is_circular = False
if is_circular:
circulars = np.append(circulars, [prime])
return len(circulars)
不幸的是,for循环是强大的慢!任何想法我可以加快这一点? 我怀疑字符串连接是瓶颈,但我不完全确定! :)
任何想法? :)
为什么你使用字符串呢? – hwiechers 2011-01-25 12:29:07
不要为`circulars`使用NumPy数组 - 它具有固定大小,并且需要在每次*调用`numpy.append()`时重新分配。 Python列表在这里是更好的选择。 (删除numpy标签,因为既不是问题也不是当前答案与numpy有关。) – 2011-01-25 13:08:46