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

2024-09-29 19:24:33 发布

您现在位置: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.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

结果如下:

0.187118

0.868182

1.2秒完成

为什么带while的函数比带for的函数更快?你知道吗


Tags: inimportselfforstringleniftime
1条回答
网友
1楼 · 发布于 2024-09-29 19:24:33

首先,range在“For”版本中生成并丢弃大量的数字数组作为循环索引。比如,10000个数组,平均每个数组有5000个项目。试着用xrange(生成器版本)替换range,你不会做太多。你知道吗

相关问题 更多 >

    热门问题