编辑:添加了l == l[::-1]作为is_palindrome5,这是相当快的,也是迄今为止最具可读性和python的。在
我最快能查到回文的是这一行:def is_palindrome1(l):
return l[:len(l) / 2] == l[(len(l)+1) / 2:][::-1]
使用python的非回文函数检查最快的问题是:
^{pr2}$
这是因为该函数在开始比较元素之前不会创建任何新列表。
请注意,我使用的非回文在第一个和最后一个元素中是不同的,因此检查在第一个比较之后立即返回(对于非回文并不总是这样)。
我还测试了mistermiagi(is_palindrome3)和pm2ring(is_palindrome4)的答案:import itertools
def create_palindrome(n):
return range(1,n) + range(n,0,-1)
def is_palindrome1(l):
return l[:len(l) / 2] == l[(len(l)+1) / 2:][::-1]
def is_palindrome2(l):
left = 0
right = len(l) - 1
for i in xrange(0,len(l) / 2):
if l[right] != l[left]:
return False
left += 1
right -= 1
return True
def is_palindrome3(seq):
for l, r in itertools.izip(iter(seq), reversed(seq)):
if l != r:
return False
return True
def is_palindrome4(seq):
return all(l == r
for _, l, r in itertools.izip(xrange((1 + len(seq)) // 2),
iter(seq), reversed(seq)))
def is_palindrome5(l):
return l == l[::-1]
if __name__ == '__main__':
import timeit
setup_palindrome = "from __main__ import create_palindrome, %s; l = create_palindrome(%i)"
setup_non_palindrome = "from __main__ import %s; l=range(%i)"
def test(f, n):
return (timeit.timeit("%s(l)" % f, setup=setup_palindrome % (f, n), number=100000),
timeit.timeit("%s(l)" % f, setup=setup_non_palindrome % (f, n), number=100000))
small = 5
big = 1000
for f in is_palindrome1, is_palindrome2, is_palindrome3, is_palindrome4:
print("%s small list: palindrome: %f non-palindrome: %f" % ((f.__name__,) + test(f.__name__, small)))
for f in is_palindrome1, is_palindrome2, is_palindrome3, is_palindrome4:
print("%s big list: palindrome: %f non-palindrome: %f" % ((f.__name__,) + test(f.__name__, big)))
结果:is_palindrome1 small list: palindrome: 0.093779 non-palindrome: 0.073669
is_palindrome2 small list: palindrome: 0.087658 non-palindrome: 0.048855
is_palindrome3 small list: palindrome: 0.085866 non-palindrome: 0.056385
is_palindrome4 small list: palindrome: 0.139685 non-palindrome: 0.123519
is_palindrome5 small list: palindrome: 0.021798 non-palindrome: 0.022422
is_palindrome1 big list: palindrome: 1.589591 non-palindrome: 0.432679
is_palindrome2 big list: palindrome: 9.414250 non-palindrome: 0.043481
is_palindrome3 big list: palindrome: 7.315568 non-palindrome: 0.056859
is_palindrome4 big list: palindrome: 6.655833 non-palindrome: 0.128915
is_palindrome5 big list: palindrome: 2.095099 non-palindrome: 0.283472