我有两组数字,每组数字都在我的 Python 脚本的列表中。对于第一个列表中的每个数字,我需要查看第二个列表中是否有任何数字大于它。我只需要 n2 大于 n1 的次数。 (例如,如果numset1
是[7,2]
并且numset2
是[6,9]
,我只需要3)
现在我正在这样做 - 遍历每个 n1 并检查每个 n2 是否大于它:
possibilities = [(n1<n2) for n1 in numset1 for n2 in numset2]
numPossibilities = sum(possibilities)
目前,这是我的脚本中最慢的部分,特别是在处理较大的数据集(numset1 和 numset2 包含数千个数字)时。我确信有某种方法可以提高效率,只是不知道如何实现。
最佳答案
对 numset2
进行排序,然后迭代 numset1
,但对 numset2
使用二分搜索,例如使用 bisect 模块:http://docs.python.org/2/library/bisect.html
import bisect
# your code here
numset2.sort()
L = len(numset2)
numPossibilities = sum([bisect.bisect_right(numset2,n1) < L for n1 in numset1])
另请注意,您的原始代码不会计算您在第二句话中所要求的内容 - 对于 numset1
中的每个元素,它会计算 中有多少个元素>numset2
大于此元素,而不是是否有符合条件的元素。
要匹配您的原始代码,请执行以下操作:
numPossibilities = sum([L - bisect.bisect_right(numset2,n1) for n1 in numset1])
关于python - 提高 Python 嵌套 for 循环的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13755239/