小编rno*_*ris的帖子

在python多处理池中共享numpy数组

我正在研究一些代码,这些代码在大量(数十到数十万个数值积分)问题上做了一些相当繁重的数值工作.幸运的是,这些集成非常平行,因此很容易使用Pool.map()将工作分成多个核心.

现在,我有一个具有这个基本工作流程的程序:

#!/usr/bin/env python
from multiprocessing import Pool
from scipy import *
from my_parser import parse_numpy_array
from my_project import heavy_computation

#X is a global multidimensional numpy array
X = parse_numpy_array("input.dat")
param_1 = 0.0168
param_2 = 1.505

def do_work(arg):
  return heavy_computation(X, param_1, param_2, arg)

if __name__=='__main__':
  pool = Pool()
  arglist = linspace(0.0,1.0,100)
  results = Pool.map(do_work,arglist)
  #save results in a .npy file for analysis
  save("Results", [X,results])
Run Code Online (Sandbox Code Playgroud)

由于X,param_1和param_2是硬编码的,并且对于池中的每个进程以完全相同的方式进行初始化,因此一切正常.现在我的代码工作了,我想这样做,以便用户在运行时输入文件名,param_1和param_2,而不是硬编码.

应该注意的一件事是X,param_1和param_2在工作完成时没有被修改.由于我不修改它们,我可以在程序开始时做这样的事情:

import sys
X = parse_numpy_array(sys.argv[1])
param_1 = float(sys.argv[2])
param_2 = float(sys.argv[3])
Run Code Online (Sandbox Code Playgroud)

这样做可以解决问题,但由于此代码的大多数用户都是从Windows机器运行代码,我宁愿不去命令行参数的路径.

我真正想做的是这样的事情:

X, …
Run Code Online (Sandbox Code Playgroud)

python numpy multiprocessing scipy

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

删除指针时的Segfault

我在运行一些C++代码时遇到了段错误.我已将问题隔离到程序中删除指针的行.这是一个产生相同错误的简单示例:

int main()
{
  int* pointer=0;
  int number = 3;

  pointer = &number;
  delete pointer;//This line causes a segmentation fault
  pointer=0;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

稍作修改就会生成符合预期的代码:

int main()
{
  int* pointer=new int(3);

  delete pointer;//This line now works
  pointer=0;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么第一个导致段错误而第二个没有?我知道指针不是无效的,因为它已被赋值给数字变量的地址.

c++ pointers segmentation-fault

2
推荐指数
1
解决办法
1万
查看次数

关于C++预处理器,使用#define有条件地排除主函数

情况就是这样:我有三个文件,Test1.cpp和Test2.cpp.Test1.cpp可以按原样编译到独立的应用程序中.Test1.cpp还包含一些我想在Test2.cpp中重用的函数.我正在使用#ifndef #endif块来有条件地排除Test1.cpp的主要功能,这样当我编译Test2.cpp时,Test2.cpp中的main函数将能够调用Test1.cpp中定义的函数.示例代码:

--------------------------------------------
//File: Test1.h
#include <iostream>
void do_something();
--------------------------------------------
//File: Test1.h
#include "Test1.h"
void do_something();
{
  std::cout<<"Done"<<std::endl;
}
#ifndef FN_MAIN
int main()
{
  do_something();
  return 0;
}
#endif
--------------------------------------
//File: Test2.cpp
#define FN_MAIN
#include "Test1.h"
int main()
{
  do_something();
  return 0;
}
--------------------------------------
Run Code Online (Sandbox Code Playgroud)

使用Test1.cpp调用g ++工作正常并且行为与预期一致,但是使用Test2.cpp和Test1.cpp调用g ++失败,因为main被多次定义.但是,使用-DFN_MAIN和两个源文件调用g ++可以解决此问题.有没有办法解决这个问题?我认为这个问题来自我对C++预处理器的不完全理解.

注意:我这样做的动机是减少我正在处理的项目代码的大小.实际项目包括独立版本的Test1.cpp和其他几个使用Test1.cpp函数的程序.

c++ macros c-preprocessor

0
推荐指数
1
解决办法
1273
查看次数