Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
其他编程语言中的Python循环传输_Python_Loops_Cython_Pypy - Fatal编程技术网

其他编程语言中的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 for
C
那样并行化,或者用另一种语言计算jsut循环?