<p>我已经为几种方法建立了基准:</p>
<ul>
<li><code>argwhere</code></li>
<li><code>nonzero</code>如问题所述</li>
<li><code>.tostring()</code>如@Rob Reilink的回答</li>
<li>python循环</li>
<li>Fortran循环</li>
</ul>
<p>可以使用<a href="https://gist.github.com/mverleg/3b63d70c806ea4eb73168870297d0bcb" rel="noreferrer">Python</a>和<a href="https://gist.github.com/mverleg/71dbbf755ed1cf96589236a69bc64027" rel="noreferrer">Fortran</a>代码。我跳过了那些没有希望的,比如转换成一个列表。</p>
<p>对数刻度的结果。X轴是指针的位置(如果它在数组的下面,则需要更长的时间才能找到);最后一个值是不在数组中的指针。Y轴是找到它的时间。</p>
<p><a href="https://i.stack.imgur.com/qgVPH.png" rel="noreferrer"><img src="https://i.stack.imgur.com/qgVPH.png" alt="benchmark results"/></a></p>
<p>这个数组有100万个元素,测试运行了100次。结果仍然有点波动,但定性趋势很明显:Python和f2py在第一个元素退出,因此它们的比例不同。如果指针不在前1%,Python会变得太慢,而<code>f2py</code>则很快(但您需要编译它)。</p>
<p>总而言之,<strong>f2py是最快的解决方案,尤其是在针出现得相当早的情况下。</p>
<p>它不是内置的,但它真的只是2分钟的工作。将<a href="https://gist.github.com/mverleg/71dbbf755ed1cf96589236a69bc64027" rel="noreferrer">this</a>添加到名为<code>search.f90</code>的文件中:</p>
<pre><code>subroutine find_first(needle, haystack, haystack_length, index)
implicit none
integer, intent(in) :: needle
integer, intent(in) :: haystack_length
integer, intent(in), dimension(haystack_length) :: haystack
!f2py intent(inplace) haystack
integer, intent(out) :: index
integer :: k
index = -1
do k = 1, haystack_length
if (haystack(k)==needle) then
index = k - 1
exit
endif
enddo
end
</code></pre>
<p>如果您要查找的不是<code>integer</code>,只需更改类型。然后使用以下命令编译:</p>
<pre><code>f2py -c -m search search.f90
</code></pre>
<p>之后您可以(从Python)执行以下操作:</p>
<pre><code>import search
print(search.find_first.__doc__)
a = search.find_first(your_int_needle, your_int_array)
</code></pre>