Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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,我制作了一个程序,它将返回所选索引的值,并返回字符串“number”旁边的5个索引。因为字符串实在太大了,大多数计算机花的时间太长了。我需要优化代码。我在某个地方读到lamda函数可以帮助我。这里有人可以建议我制作字符串的其他方法或制作程序的其他方法 number = "" for num in range(2,999999): prime = True for i in range(2,num): if (num%i==0): prime

我制作了一个程序,它将返回所选索引的值,并返回字符串“number”旁边的5个索引。因为字符串实在太大了,大多数计算机花的时间太长了。我需要优化代码。我在某个地方读到lamda函数可以帮助我。这里有人可以建议我制作字符串的其他方法或制作程序的其他方法

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]