小编Sta*_*Bak的帖子

在多处理池中运行scipy.integrate.ode会导致巨大的性能损失

我正在使用python scipy.integrate来模拟29维线性微分方程组.由于我需要解决几个问题实例,我想我可以通过并行计算来加速它multiprocessing.Pool.由于线程之间没有共享数据或同步(问题是令人尴尬的并行),我认为这显然应该有效.然而,在我编写完代码之后,我得到了非常奇怪的性能测量:

  • 单线程,无jacobian:每次通话20-30 ms
  • 单线程,带雅可比:每次通话10-20毫秒
  • 多线程,没有雅可比:每次通话20-30毫秒
  • 多线程,雅可比:每次通话10-5000毫秒

什么是令人震惊的是,我认为应该是最快的设置,实际上是最慢的,而变异是两个数量级.这是一个确定性的计算; 计算机不应该以这种方式工作.什么可能导致这个?

效果似乎与系统有关

我在另一台计算机上尝试了相同的代码,但我没有看到这种效果.

两台机器都使用Ubuntu 64位,Python 2.7.6,scipy版本0.18.0和numpy版本1.8.2.我没有看到Intel(R)Core(TM)i5-5300U CPU @ 2.30GHz处理器的可变性.我确实看到了英特尔(R)Core(TM)i7-2670QM CPU @ 2.20GHz的问题.

理论

一个想法是处理器之间可能存在共享缓存,并且通过并行运行它不能适应缓存中的jacobian矩阵的两个实例,因此它们不断地相互竞争以使缓存相互减慢它们是连续运行或没有jacobian.但它不是一个百万变量系统.jacobian是一个29x29矩阵,占用6728个字节.处理器上的1级缓存为4 x 32 KB,大得多.处理器之间是否还有其他共享资源可能是罪魁祸首?我们怎么测试呢?

我注意到的另一件事是每个python进程在运行时似乎占用了几百%的CPU.这似乎意味着代码已经在某些时候并行化了(可能在低级库中).这可能意味着进一步的并行化无济于事,但我不希望这种急剧放缓.

尝试在更多机器上查看(1)其他人是否可以体验到减速并且(2)发生减速的系统的共同特征是什么是好的.该代码使用大小为2的多处理池进行两次并行计算的10次试验,为10次试验中的每次试验打印出每次scipy.ode.integrate调用的时间.

'odeint with multiprocessing variable execution time demonsrtation'

from numpy import dot as npdot
from numpy import add as npadd
from numpy import matrix as npmatrix
from scipy.integrate import ode
from multiprocessing import Pool
import time

def main():
    "main function"

    pool = Pool(2) # …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy python-multiprocessing

12
推荐指数
1
解决办法
945
查看次数

当多边形变得太小时,带有polycollection的绘图会消失

我用a PolyCollection来绘制各种尺寸的数据.有时候多边形非常小.如果它们太小,它们根本就不会被绘制.我希望大纲至少能够显示出来,这样你才能知道有些数据存在.有控制这个的设置吗?

这里是一些重现问题的代码,以及输出图像:

import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
from matplotlib import colors

fig = plt.figure()
ax = fig.add_subplot(111)
verts = []

edge_col = colors.colorConverter.to_rgb('lime')
face_col = [(2.0 + val) / 3.0 for val in edge_col] # a little lighter

for i in range(10):
    w = 0.5 * 10**(-i)
    xs = [i - w, i - w, i + w, i - w]
    ys = [-w, w, 0, -w]

    verts.append(list(zip(xs, ys)))

ax.set_xlim(-1, 11)
ax.set_ylim(-2, 2)

ax.add_collection(PolyCollection(verts, lw=3, …
Run Code Online (Sandbox Code Playgroud)

python matplotlib

7
推荐指数
1
解决办法
147
查看次数

为什么0 = 0.5?

在使用.smt2文件时,我注意到Z3 4.3.1有一些奇怪的行为.

如果我这样做(assert (= 0 0.5))将是令人满意的.但是,如果我切换订单并且(assert (= 0.5 0))不满意.

我对正在发生的事情的猜测是,如果第一个参数是一个整数,它将它们都转换为整数(将0.5舍入为0),然后进行比较.如果我将"0"更改为"0.0",它将按预期工作.这与我使用的大多数编程语言形成对比,如果其中一个参数是浮点数,它们都被转换为浮点数并进行比较.这真的是Z3中的预期行为吗?

z3

5
推荐指数
2
解决办法
485
查看次数

标签 统计

python ×2

matplotlib ×1

numpy ×1

python-multiprocessing ×1

scipy ×1

z3 ×1