【问题标题】:Which code is better to find the first recurring alphabet in a string? [closed]哪个代码更适合在字符串中找到第一个重复出现的字母? [关闭]
【发布时间】:2018-06-12 20:43:38
【问题描述】:

第一个代码是:

 string = "DBCABA"
 #computing the first recurring alphabet
 def compute_reccuring():
     for a in string:
         var = string.count(a)
         if var > 1:
            final = str(a) 
        print(str(final) + " is repeated first")
        break

第二个代码是:

def recurring():
    counts = {}
    for a in string:
        if a in counts:
           print(a)
        else:
           counts[a] = 1

这两种代码都可以,但我不知道哪一种的性能更好。

【问题讨论】:

  • 创建一个足够大的字符串并尝试测试性能。
  • string.count 是一个隐式循环。此外,在第二个示例中,if a in counts.. 可能应该在外部/之前终止。
  • 所以在我看来第一个是O(n^2)(对于每个a in string,你在.count(a) 中再次遍历整个字符串),而第二个是O(n),因为你'正在使用dict (counts),它的访问时间恒定为O(1) 所以,只需查看代码,我会说第二个“更好” 但是,在第二个中你需要在内存中保留dict,这样可能会占用更多内存...取决于您认为更好...更快?内存少?

标签: python algorithm search


【解决方案1】:

您可以使用以下代码检查脚本运行所用的时间。

import time
start = time.time()
'''
Your Code

'''
end = time.time()

print(start - end)

【讨论】:

    【解决方案2】:

    如下创建一个计时器函数,并用它装饰你的函数并自己查看结果。

    import time                                                
    
    def timeme(method):
        def wrapper(*args, **kw):
            startTime = int(round(time.time() * 1000))
            result = method(*args, **kw)
            endTime = int(round(time.time() * 1000))
    
            print(endTime - startTime,'ms')
            return result
    
        return wrapper
    

    然后你可以使用这个函数作为你的函数的装饰器。像这样的:

    @timeme
    def recurring():
    

    【讨论】:

    • 谢谢。它显示了这两个函数的时间,但是内存呢?
    • 也许你可以试试memory_profiler。希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2015-05-12
    • 2013-02-21
    • 1970-01-01
    • 2018-12-12
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多