我正在研究一些代码,这些代码在大量(数十到数十万个数值积分)问题上做了一些相当繁重的数值工作.幸运的是,这些集成非常平行,因此很容易使用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) 我在运行一些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)
有人可以解释为什么第一个导致段错误而第二个没有?我知道指针不是无效的,因为它已被赋值给数字变量的地址.
情况就是这样:我有三个文件,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函数的程序.