其他编程语言中的Python循环传输
我还有一个关于大循环的问题 假设我有一个函数其他编程语言中的Python循环传输,python,loops,cython,pypy,Python,Loops,Cython,Pypy,我还有一个关于大循环的问题 假设我有一个函数 限制 def limits(a,b): *evaluate integral with upper and lower limits a and b* return float result A和B是存储我的值A和B的简单np.Array。现在我想计算积分300000^2/2次,因为A和B的长度各为300000,积分是对称的 在Python中,我尝试了几种方法,比如itertools.combines\u with_replacement来
限制
def limits(a,b):
*evaluate integral with upper and lower limits a and b*
return float result
A和B是存储我的值A和B的简单np.Array。现在我想计算积分300000^2/2次,因为A和B的长度各为300000,积分是对称的
在Python中,我尝试了几种方法,比如itertools.combines\u with_replacement
来创建A和B的组合,然后将它们放入整数中,但这需要大量时间,而且内存完全超载。
有没有办法,比如用另一种语言传输循环,来加快速度
我想运行循环
for i in range(len(A)):
for j in range(len(B)):
np.histogram(limits(A[i],B[j]))
我认为对限制的返回进行historogramming是可取的,这样就不会存储额外的方正增长的数组
从我所读到的内容来看,python并不是这个迭代ansatzes的最佳选择
因此,在Python中用另一种语言计算这个循环是否合理,如果是,如何进行。我知道有很多方法可以传输代码,但到目前为止我还没有这样做过
谢谢你的帮助 如果您担心内存占用,只需在for循环中存储结果即可
num_bins = 100
bin_upper_limits = np.linspace(-456, 456, num=num_bins-1)
# (last bin has no upper limit, it goes from 456 to infinity)
bin_count = np.zeros(num_bins)
for a in A:
for b in B:
if b<a:
# you said the integral is symmetric, so we can skip these, right?
continue
new_result = limits(a,b)
which_bin = np.digitize([new_result], bin_upper_limits)
bin_count[which_bin] += 1
num\u bins=100
bin\u上限=np.linspace(-456456,num=num\u bin-1)
#(最后一个箱子没有上限,它从456到无穷大)
箱数=np.0(箱数)
对于a中的a:
对于b中的b:
如果b0、0-->1、1-->1、1-->2、0-->2等诸如此类,那么您正在一次又一次地做同样的工作。如果已积分0-->1和1-->2,则可以将这两个结果相加,得到积分0-->2。你不必使用一个奇特的积分算法,你只需要加上两个你已经知道的数字
因此,在我看来,您可以计算所有最小范围(0-->1,1-->2,2-->3)中的积分,将结果存储在数组中,然后添加结果的子集以获得所需范围内的积分。如果您想让这个程序在几分钟内而不是4小时内运行,我建议您按照这些思路考虑另一种算法
(如果我误解了您试图解决的问题,很抱歉。)itertools。组合和朋友生成迭代器。通常,您直接在这些对象上循环,而不尝试在内存中扩展它们(例如,通过将它们转换为列表);随机访问不需要所有中间结果,是吗?300k^2/2=450亿。仅仅把它移植到另一种语言并不能解决这个问题,你甚至需要强大的硬件和巧妙的优化才能开始。@MartijnPieters,不,我不需要中间结果,只需要最终的(历史程序设计的)结果。delnan,C语言中有一段代码总共在4小时内完成了这项工作。我希望同样高效。@madzone:那么不要将迭代器的结果具体化到列表中;只需在其上循环,并将每个结果用作中介,在循环迭代结束时再次丢弃它。@MartijnPieters,我可以问你一个简短的片段吗?谢谢你的回答。我使用np.histogram
直接对我的输出进行柱状图分析,类似于您的建议。不过,我认为这个循环导致了这个问题,而不是我正在处理的简单函数。从一个月以来,我一直在努力提高这一点,但在Python中失败了。有没有一种方法可以像MPI forC
那样并行化,或者用另一种语言计算jsut循环?