Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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函数中WHILE比FOR更有效_Python - Fatal编程技术网

为什么在这个python函数中WHILE比FOR更有效

为什么在这个python函数中WHILE比FOR更有效,python,Python,主题:给定一个字符串,查找最长子字符串的长度,不重复字符。 代码: import time import string import random class Solution: def getRandomStr(self,length): s = "" for x in range(0,length): s += random.choice(string.ascii_letters+string.digi

主题:给定一个字符串,查找最长子字符串的长度,不重复字符。 代码

import time
import string
import random

class Solution:


    def getRandomStr(self,length):
        s = ""
        for x in range(0,length):
            s += random.choice(string.ascii_letters+string.digits)
        return s

    # O(n)
    def hasValue(self,s,v,p,r):
        for k in range(p,r+1):
            if s[k] == v:
                return True
        return False

    # O(n^3)
    # if s[j] is found in prestr , 
    def lengthOfLongestSubstringWhile(self,s):
        
        maxlen = 0
        i = 0
        j = 0
        exitsign = False
        t0 = time.clock()
        while i < len(s):
            j = i+1
            while j < len(s):
                if self.hasValue(s,s[j],i,j-1):
                    maxlen = max(maxlen,j-i)
                    break
                elif j == len(s)-1:
                    maxlen = max(maxlen,j-i+1)
                    exitsign = True
                    break
                j+=1
            if exitsign:
                break
            i+=1
        # print maxlen

    def lengthOfLongestSubstringFor(self,s):
        maxlen = 0
        exitsign = False
        for i in range(0,len(s)):
            for j in range(i+1,len(s)):
                if self.hasValue(s,s[j],i,j-1):
                    maxlen = max(maxlen,j-i)
                    break
                elif j == len(s)-1:
                    maxlen = max(maxlen,j-i+1)
                    exitsign = True
                    break 
            if exitsign:
                break
        # print maxlen

    
S = Solution()
s = S.getRandomStr(10000)

t0 = time.clock()
S.lengthOfLongestSubstringWhile(s)

t1 = time.clock()
S.lengthOfLongestSubstringFor(s)
t2 = time.clock()

print t1-t0,t2-t1
导入时间
导入字符串
随机输入
类解决方案:
def getRandomStr(自身,长度):
s=“”
对于范围内的x(0,长度):
s+=random.choice(string.ascii_字母+string.digits)
返回s
#O(n)
def值(自身、s、v、p、r):
对于范围内的k(p,r+1):
如果s[k]==v:
返回真值
返回错误
#O(n^3)
#如果在prestr中找到s[j],
def lengthOfLongestSubstringWhile(自身):
maxlen=0
i=0
j=0
exitsign=False
t0=时间。时钟()
而我
结果是:

0.187118

0.868182

在1.2秒内完成


为什么使用
while
的函数比使用
for
的函数更快?

首先,
range
在“for”版本中生成并丢弃了大量数字数组作为循环索引。比如,10000个数组,平均每个数组有5000个项目。尝试将
range
替换为
xrange
(生成器版本),这样做的次数不会太多。

一方面,
range
正在生成并丢弃大量的数字数组作为“For”版本中的循环索引。比如,10000个数组,平均每个数组有5000个项目。尝试将
range
替换为
xrange
(生成器版本),这样做不会太多。

这不是非常惯用的Python,我想您的第一种语言是类似C的。例如,我们不是为范围(0,len)中的i编写
而是为枚举中的i编写
您是对的。本周一我开始使用Python:)这不是很地道的Python,我想你的第一语言是C语言。例如,我们不是为范围(0,len)中的i编写
而是为枚举中的i编写
您是对的。本周一我开始使用Python:)我按照你说的做了,它已经修好了。非常感谢!如果你能“接受”我的答案,那就太好了:)这是我第一次使用stackoverflow。那我怎么能接受呢?我按照你说的做了,它已经修好了。非常感谢!如果你能“接受”我的答案那就太好了:)这是我第一次使用stackoverflow。那么我怎么能接受呢?