<p>虽然这些答案可能适用于OP的具体情况,但我发现它们在更广泛的应用中并不令人满意。</p>
<p>以下是我能想到/看到的方法以及它们各自的时间安排。</p>
<h2>指数法</h2>
<pre><code>urlist_len = len(urlist)-1
for x in urlist:
if urlist.index(x) == urlist_len:
pass
</code></pre>
<h2>负切片法</h2>
<pre><code>for x in urlist:
if x == urlist[-1]:
pass
</code></pre>
<h2>枚举方法</h2>
<pre><code>urlist_len = len(urlist)-1
for index, x in enumerate(urlist):
if index == urlist_len:
pass
</code></pre>
<p>以下是一些不同方法的时间安排:</p>
<pre><code>╔════════════════════════════════════════════════════════════════╗
║ Timing Results (s) ║
╠═══════════════════════╦════╦═════════╦════════╦═══════╦════════╣
║ List size ║ 20 ║ 200 ║ 2000 ║ 20000 ║ 200000 ║
╠═══════════════════════╬════╬═════════╬════════╬═══════╬════════╣
║ ║ 0 ║ 0.0006 ║ 0.051 ║ 5.2 ║ 560 ║
║ Index Method ║ ║ ║ ║ ║ ║
╠═══════════════════════╬════╬═════════╬════════╬═══════╬════════╣
║ ║ 0 ║ 0 ║ 0.0002 ║ 0.003 ║ 0.034 ║
║ Negative Slice Method ║ ║ ║ ║ ║ ║
╠═══════════════════════╬════╬═════════╬════════╬═══════╬════════╣
║ Enumerate Method ║ 0 ║ 0.00004 ║ 0.0005 ║ 0.016 ║ 0.137 ║
╚═══════════════════════╩════╩═════════╩════════╩═══════╩════════╝
</code></pre>
<p><sup>注意:值<;10us四舍五入为0</p>
<p>如您所见,index方法总是要慢一些,并且它只会随着列表大小的增加而呈指数级恶化。我看没有任何理由用它。负切片方法在所有情况下都是最快的,<strong>但是如果列表中有重复项,它将给您一个假阳性</strong>。此外,负切片方法要求正在迭代的序列支持索引。因此,如果列表中有重复项(或不支持索引序列),请使用快速但不是最快的枚举方法。</p>
<p><strong>编辑:正如一位评论员指出的那样,计算循环中列表的长度并不理想。利用这一知识,我可以将枚举方法(目前未反映在表中)减少35%。</strong></p>
<hr/>
<p>tldr:如果所有元素都是唯一的并且序列支持索引,则使用负切片,否则使用枚举方法</p>