Python 列表中最长单词的长度
要计算最长单词的长度,哪种方法更像是python方法:Python 列表中最长单词的长度,python,string,performance,list,coding-style,Python,String,Performance,List,Coding Style,要计算最长单词的长度,哪种方法更像是python方法: len(max(words,key=len)) 或: max(len(w)表示w,大写) 或者。。还有别的吗words是字符串列表。 我发现我需要经常这样做,在对几个不同的样本大小进行计时后,第一种方法似乎始终更快,尽管表面上看起来效率较低(被调用两次的len的冗余似乎无关紧要-在这种形式的C代码中会发生更多吗?) 我得说 len(max(x, key=len)) 看起来相当不错,因为您使用了内置(max)的关键字参数(key)和内置(l
len(max(words,key=len))
或:
max(len(w)表示w,大写)
或者。。还有别的吗words
是字符串列表。
我发现我需要经常这样做,在对几个不同的样本大小进行计时后,第一种方法似乎始终更快,尽管表面上看起来效率较低(被调用两次的len
的冗余似乎无关紧要-在这种形式的C代码中会发生更多吗?) 我得说
len(max(x, key=len))
看起来相当不错,因为您使用了内置(max
)的关键字参数(key
)和内置(len
)。所以基本上,max(x,key=len)
几乎可以得到答案。但在我看来,您的代码变体中没有一个看起来特别不符合Python。尽管:
max(len(w) for w in words)
“阅读”更容易——你有发电机的开销
而:
len(max(words, key=len))
可以使用内置键进行优化,而且由于
len
通常是非常有效的字符串操作,因此速度会更快…仅用于使用ipython%timeit的信息
In [150]: words
Out[150]: ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat']
In [148]: %timeit max(len(w) for w in words)
100000 loops, best of 3: 1.87 us per loop
In [149]: %timeit len(max(words, key=len))
1000000 loops, best of 3: 1.35 us per loop
刚刚更新了更多的文字来展示@Omnifarious的观点/评论
In [160]: words = map(string.rstrip, open('/usr/share/dict/words').readlines())
In [161]: len(words)
Out[161]: 235886
In [162]: %timeit max(len(w) for w in words)
10 loops, best of 3: 44 ms per loop
In [163]: %timeit len(max(words, key=len))
10 loops, best of 3: 25 ms per loop
我认为两者都可以,但我认为除非速度是一个重要的考虑因素,否则max(len(w)代表w)是最具可读性的
当我看着它们的时候,我花了更长的时间才弄清楚len(max(words,key=len))
在做什么,直到我进一步思考,我还是错的。除非有充分的理由,否则代码应该立即变得显而易见
从其他帖子(以及我自己的测试)可以清楚地看出,可读性较差的帖子速度更快。但他们两个都不慢。除非代码处于关键路径,否则就不值得担心
归根结底,我认为更具可读性更具蟒蛇风格
另一方面,对于相同的任务,这是Python2明显比Python3快的少数几种情况之一。如果将生成器表达式重写为map
调用(或者,对于2.x,imap
):
…它实际上比密钥版本快一点,而不是慢一点
python.org 64位3.3.0:
In [186]: words = ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] * 100
In [188]: %timeit max(len(w) for w in words)
%10000 loops, best of 3: 90.1 us per loop
In [189]: %timeit len(max(words, key=len))
10000 loops, best of 3: 57.3 us per loop
In [190]: %timeit max(map(len, words))
10000 loops, best of 3: 53.4 us per loop
苹果64位2.7.2:
In [298]: words = ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] * 100
In [299]: %timeit max(len(w) for w in words)
10000 loops, best of 3: 99 us per loop
In [300]: %timeit len(max(words, key=len))
10000 loops, best of 3: 64.1 us per loop
In [301]: %timeit max(map(len, words))
10000 loops, best of 3: 67 us per loop
In [303]: %timeit max(itertools.imap(len, words))
10000 loops, best of 3: 63.4 us per loop
我认为它比键
版本更具python风格,原因与genexp相同
它是否像genexp版本一样具有Python功能还存在争议。有些人喜欢地图
/过滤器
/减少
/等等。;有些人讨厌他们;我个人的感觉是,当你试图映射一个已经存在并且有一个好名字的函数时(也就是说,你不需要lambda
或partial
up),map
更好,但是YMMV(特别是如果你的名字是Guido)
最后一点:
两次调用len的冗余似乎无关紧要——在这种形式的C代码中会发生更多的情况吗
这样想吧:你已经打了N次电话了。与你必须做的任何事情相比,称它为N+1
次几乎不可能有什么不同,除非你有一小部分巨大的字符串。我知道已经一年了,但无论如何,我想到了这个:
''编写一个函数find_longest_word(),该函数包含一个单词列表和
返回最长的长度。“”
@我个人更喜欢后者,看起来更漂亮。len(max(words,key=len))
很好,因为它是一个哦,我忘记了max把key作为参数。一般来说,python与英语配合得很好,所以如果你能看懂它,并且它很清楚,你可能会很好。1.len最大字数,或2个。麦克斯·伦的文字。@monkut:但第一个更像是“伦的文字的麦克斯”。但为什么呢?有什么原因吗?@A.R.S.:加了一个简短的,嗯。。。主观原因。尽管如此——我不能说哪个更“Pythonic”——我两个都喜欢,但对于不熟悉max
withkey
的人来说,也许前者会更容易理解,因为列表越长,差异越大。max(map(len,words))
的可读性和明显性也很强。所以它得到了我的投票。@Omnifarious:它对我和你们来说都是可读的和显而易见的……但也许不是每个人都这么认为。在我的测试中,3.3.0在我能想到的每一个版本中都超过了2.7.2。更新:事实上,如果我在32位模式下运行它们,3.3.0的速度会明显慢一些。但在32位的3.2或3.3中,几乎所有的东西都显得很慢,至少在Mac上是这样,所以我不认为这有什么特别的地方。@abarnert:很有趣。我在Linux系统上以64位模式运行了它们。一个是Python2.7.3,另一个是3.3.0。我用/usr/share/dict/words
作为单词列表。我的速度是88毫秒对66毫秒。也许是我选择了一个很长的单词列表,才产生了不同。@Omnifarous:使用70000个单词而不是700个单词,我得到了几乎完全相同的性能数字乘以100。基本上,64位3.3比64位2.7快8-14%,但32位3.3比32位2.7慢0-10%(32位和64位2.7彼此相差不超过2%)。(然而,正如您所料,PyPy使用70000似乎比使用700做得好得多……我没有将其包括在我的答案中,因为我测试的机器没有用于PyPy的ipython。)
In [298]: words = ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] * 100
In [299]: %timeit max(len(w) for w in words)
10000 loops, best of 3: 99 us per loop
In [300]: %timeit len(max(words, key=len))
10000 loops, best of 3: 64.1 us per loop
In [301]: %timeit max(map(len, words))
10000 loops, best of 3: 67 us per loop
In [303]: %timeit max(itertools.imap(len, words))
10000 loops, best of 3: 63.4 us per loop
a = ['mamao', 'abacate', 'pera', 'goiaba', 'uva', 'abacaxi', 'laranja', 'maca']
def find_longest_word(a):
d = []
for c in a:
d.append(len(c))
e = max(d) #Try "min" :D
for b in a:
if len(b) == e:
print "Length is %i for %s" %(len(b), b)