Python 制作和索引非常长的字符串
我制作了一个程序,它将返回所选索引的值,并返回字符串“number”旁边的5个索引。因为字符串实在太大了,大多数计算机花的时间太长了。我需要优化代码。我在某个地方读到lamda函数可以帮助我。这里有人可以建议我制作字符串的其他方法或制作程序的其他方法Python 制作和索引非常长的字符串,python,Python,我制作了一个程序,它将返回所选索引的值,并返回字符串“number”旁边的5个索引。因为字符串实在太大了,大多数计算机花的时间太长了。我需要优化代码。我在某个地方读到lamda函数可以帮助我。这里有人可以建议我制作字符串的其他方法或制作程序的其他方法 number = "" for num in range(2,999999): prime = True for i in range(2,num): if (num%i==0): prime
number = ""
for num in range(2,999999):
prime = True
for i in range(2,num):
if (num%i==0):
prime = False
if prime:
number = number + str(num)
print(number[n:n+5])
PS=这是我做的,这一个肯定更像是幻觉
def answer(n):
number = "2357"
i = 9
while(i<999999):
prime = True
if (i%5==0):
i=i+2
prime = False
continue
if (i%3==0 | i%7==0):
i=i+2
prime = False
continue
if prime:
number = number + str(i)
i=i+2
continue
print(number[n:n+5])
def应答(n):
number=“2357”
i=9
而下面的(i代码更优化
number = ""
for num in range(2,999999):
prime = True
for i in range(2,num/2):
if (num%i==0):
prime = False
break
if prime:
number = number + str(num)
print(number[n:n+5])
1) 一旦发现数字不是素数,就应该中断循环,而不是继续循环。
2) 不需要到n-1检查它是否为素数。您可以通过将lambda设置为n/2来检查它,lambda对您没有帮助,但是您的代码可以稍微优化一下
import math
number = ""
for num in range(2,999999):
prime = True
for i in range(2, int(math.sqrt(num))):
if (num%i==0):
prime = False
break
if prime:
number = number + str(num)
print(number[n:n+5])
有许多更快的素数生成算法,例如:
下面的代码示例使用在Eli Bendersky的示例中发现的Eratosthenes筛
字符串在Python中是不可变的对象,因此使用加号运算符进行字符串连接不是很有效,特别是对于长字符串,我假设运行时行为为O(n2)。可以在中找到字符串连接方法的比较
以下代码使用与生成器连接。此外,不必计算超过n+5的整个字符串
了解发电机的链接:
- Python教程:
代码:
结果:
23571
19232
02192
81258
我不知道多久会使用一次my_func
。因此,另一种方法是计算内存中的整个字符串。但是,如果对大量素数进行字符串生成,但只使用n的小值,那么字符串生成可能会浪费时间
my_func
的一个小优化是通过不使用对n来说太小的素数来限制字符串长度。它节省内存,但运行时
受影响不大,因为生成素数花费的时间最多
def my_func(n):
total = 0
s = ''
for prime in gen_primes():
p = str(prime)
lp = len(p)
if lp <= n:
n -= lp
elif n > 0:
s = p[n:]
n = 0
else:
s += p
ls = len(s)
if ls >= 5:
return s[0:5]
def my_func(n):
总数=0
s=“”
对于gen_primes()中的prime:
p=str(素数)
lp=len(p)
如果lp 0:
s=p[n:]
n=0
其他:
s+=p
ls=len(s)
如果ls>=5:
返回s[0:5]
Num/2的平方根太多了,Num的平方根也太少了。你可以跳过2以上的所有偶数(作为潜在素数和因子),只检查奇数。看看埃拉托什内斯算法()中寻找素数的筛似乎你的问题是关于素数的。为什么标题是关于制造字符串的?我们在代码中制造了一个素数字符串,这是真的,我被你的答案吓了一跳。它使用更少的资源。我真的很想知道你是从哪里学到这些的。而且,你的程序比我的效率高1000倍。非常感谢您给我的任何建议。@KrishnaChaudhari Python文档非常好。另外,我在答案中添加了一些链接供进一步阅读。
def my_func(n):
total = 0
s = ''
for prime in gen_primes():
p = str(prime)
lp = len(p)
if lp <= n:
n -= lp
elif n > 0:
s = p[n:]
n = 0
else:
s += p
ls = len(s)
if ls >= 5:
return s[0:5]