擅长:python、mysql、java
<p>也许可以做一些更有效的事情,但是这个解决方案的优点是严重依赖于<code>numpy</code>的速度。对于10k范围,这在我的笔记本电脑上运行约600毫秒</p>
<pre class="lang-py prettyprint-override"><code>from collections import defaultdict
import numpy as np
# Generate data
def generate_ranges(n):
boundaries = np.random.randint(-10_000, 10_000, size=(n, 2))
boundaries.sort(axis=1)
return [range(x, y) for x, y in boundaries]
ranges = generate_ranges(10_000)
# Extract boundaries
starts, stops = np.array([[range.start, range.stop] for range in ranges]).T
# Set of all numbers we should test
n = np.arange(starts.min(), stops.max() + 1)[:, None]
# Test those numbers
counts = ((n >= starts[None, :]) & (n < stops[None, :])).sum(axis=1)
# Wrap the result into a dict
d = defaultdict(int, dict(zip(n.flatten(), counts)))
</code></pre>