在下面的示例中,两个函数的程序数大致相同。
def lenIter(aStr):
count = 0
for c in aStr:
count += 1
return count
或
def lenRecur(aStr):
if aStr == '':
return 0
return 1 + lenRecur(aStr[1:])
在两种技术之间进行选择是一种风格问题还是这里有一种最有效的方法?
答案 0 :(得分:2)
Python does not perform tail call optimization,因此递归解决方案可以在长字符串上遇到堆栈溢出。迭代方法没有这个缺陷。
那就是说,len(str)
比两种方法都快。
答案 1 :(得分:2)
答案 2 :(得分:0)
当然第一种方法更加优化,因为python不需要进行大量的函数调用和字符串切片,其中每个操作都包含一些其他操作,这些操作对python解释器来说花费很多,并且可能导致将来和处理日志字符串时会遇到很多问题。
作为一种更加pythonic的方式,您最好使用len()
函数来获取字符串的长度。
您还可以使用code
对象查看每个函数所需的堆栈大小:
>>> lenRecur.__code__.co_stacksize
4
>>> lenIter.__code__.co_stacksize
3