我使用Python多处理模块在蒙特卡罗代码中实现了一些简单的并行性.我的代码看起来像:
montecarlos = [MonteCarlo(f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [mc.results for mc in montecarlos]
Run Code Online (Sandbox Code Playgroud)
但是,当我查看结果列表时,看起来monte carlo迭代器甚至还没有开始.我知道他们有,因为我可以在monte carlo步骤中打印出信息.所以我做的事情是愚蠢的.我原以为job.join()会保留结果列表,直到所有内容都运行,因此mc.results字段会被更新.
我意识到我没有告诉你我的蒙特卡洛例程的细节,并希望它没关系,而我所犯的错误在于我对多处理工作的解释.提前感谢您提供的任何帮助.
我正在重新设计/重构我的Python量子化学包(pyquante).我不喜欢现有版本的一件事是我必须安装软件包才能运行测试套件.也就是说,测试套件有类似的声明from PyQuante import SCF,当然,这个PyQuante可以引用已安装的版本或本地版本.
我知道virtualenv,并意识到这是我的选择.但我想知道其他什么是合适的.在过去,我已经破解sys.path了这样的事情,而且更好的Python程序员告诉我,我不应该这样做.
有没有人对我如何做到这一点有任何建议?关键是我想测试当前版本的代码而不安装它.
提前感谢任何能够看透我的bab呀声并提供建议的人!
我通常在我的模块中编写单元测试和doctests.我想在运行测试套件时自动运行我的所有doctests.我认为这是可能的,但我在语法上遇到了困难.
我有测试套件
import unittest
class ts(unittest.TestCase):
def test_null(self): self.assertTrue(True)
if __name__ == '__main__': unittest.main()
Run Code Online (Sandbox Code Playgroud)
我想在这个套件中添加模块中的所有doctests module1.我怎样才能做到这一点?我已经阅读了python文档,但是我在这里并没有更接近成功.添加线条
import doctest
import module1
suite = doctest.DocTestSuite(module1)
Run Code Online (Sandbox Code Playgroud)
不起作用.unittest.main()通过当前的文件范围和运行每个测试的搜索情况下,它发现,对不对?但是DocTestSuite会生成一个测试套件.如何unittest.main()在套件中运行其他案例?或者我只是困惑和迷惑?
再一次,我会感激任何人都可以提供的任何帮助.
我正在写一个Cthon函数的Cython包装器.我有一个带有以下签名的pxd文件:
double contr_hrr(int lena, double xa, double ya, double za, double *anorms)
Run Code Online (Sandbox Code Playgroud)
当我尝试从pyx文件中调用它时
...
return contr_hrr(len(acoefs),a.origin[0],a.origin[1],a.origin[2],anorms2)
Run Code Online (Sandbox Code Playgroud)
其中anorms2是一个python列表,我收到错误消息:
cython/ctwo.pyx:35:80: Cannot convert Python object to 'double *'
Run Code Online (Sandbox Code Playgroud)
如何将python列表作为双数组传递给C函数?
仍然对Julia标准库中的内容有所了解.我可以通过int()函数将字符串转换为它们的整数表示,但是当我用char调用int()时,我得到对应于该字符的整数值.目前我首先调用string():
intval = int(string(c))
Run Code Online (Sandbox Code Playgroud)
这是接受的方式吗?还是有更标准的方法?它在我的Project Euler练习中出现了很多.
假设我有一个像这样的名字
>>> Point = namedtuple('Point','x y')
Run Code Online (Sandbox Code Playgroud)
为什么我通过构造单个对象
>>> Point(3,4)
Run Code Online (Sandbox Code Playgroud)
但是当我想通过地图应用Point时,我必须打电话
>>> map(Point._make,[(3,4),(5,6)])
Run Code Online (Sandbox Code Playgroud)
我怀疑这可能与类方法有关,我希望在搞清楚这一点时我也会更多地了解它们.提前致谢.
我想将行索引和列索引转换为Excel字母数字单元格引用,例如“ A1”。我正在使用python和openpyxl,我怀疑该程序包中的某个地方可以执行此操作,但是经过一些搜索后我什么都没找到。
我写了下面的代码,它可以工作,但是我宁愿使用openpyxl软件包中的一部分(如果有的话)。
def xlref(row,column):
"""
xlref - Simple conversion of row, column to an excel string format
>>> xlref(0,0)
'A1'
>>> xlref(0,26)
'AA1'
"""
def columns(column):
from string import uppercase
if column > 26**3:
raise Exception("xlref only supports columns < 26^3")
c2chars = [''] + list(uppercase)
c2,c1 = divmod(column,26)
c3,c2 = divmod(c2,26)
return "%s%s%s" % (c2chars[c3],c2chars[c2],uppercase[c1])
return "%s%d" % (columns(column),row+1)
Run Code Online (Sandbox Code Playgroud)
有人知道更好的方法吗?
我管理着一个相当大的基于python的量子化学套件PyQuante.我目前正在努力设置各种默认设置,以便用户可以在运行时选择不同的选项.
例如,我有三种不同的计算电子排斥积分的方法.我们称他们为a,b,c.我过去只是选择我最喜欢的那个(比方说,c),并将其硬连接到计算这些积分的模块中.
我现在修改了它以使用包含所有这些硬线的模块Defaults.py.但这是在编译/安装时设置的.我现在希望用户能够在运行时覆盖这些选项,比如使用.pyquanterc.py文件.
在我的整体惯例中,我目前有类似的东西
from Defaults import integral_method
Run Code Online (Sandbox Code Playgroud)
我知道字典和.update()方法.但我不知道如何在现实生活中使用它.我的默认模块看起来像
integral_method = c
Run Code Online (Sandbox Code Playgroud)
我应该修改Defaults.py的结尾来查找.pythonrc.py文件并覆盖这些值吗?例如
if os.path.exists('$HOME/.pythonrc.py'): do_something
Run Code Online (Sandbox Code Playgroud)
如果是这样,应该做什么样的东西?
我正在脑力衰竭,但我无法让它发挥作用.我有一系列的距离:
import numpy as np
zvals = np.linspace(-5,5,10)
d = np.array([(0,0,z) for z in zvals])
Run Code Online (Sandbox Code Playgroud)
我想计算数组中点的平方距离.实现这项工作的非笨拙方式是:
d2 = np.array([np.dot(d[i,:],d[i,:]) for i in range(d.shape[0])])
Run Code Online (Sandbox Code Playgroud)
但是,我知道必须有一些方法可以通过一次调用dot来做到这一点,对吧?话既然说,也没有
d2 = np.dot(d,d.T)
Run Code Online (Sandbox Code Playgroud)
要么
d2 = np.dot(d.T,d)
Run Code Online (Sandbox Code Playgroud)
给我想要的东西.我意识到,我是傻瓜,但请在这里赐教.谢谢!
我试图抓住朱莉娅,来自Python.目前正在解决一些Project Euler问题,我在Julia中使用Python解决了这个问题,以便更好地理解语言.我做了很多事情(在Project Euler和现实生活中)是将一个大的多线数据对象解析成一个数组.例如,如果我有数据
data = """1 2 3 4
5 6 7 8
9 0 1 2"""
Run Code Online (Sandbox Code Playgroud)
在python我可能会这样做
def parse(input):
output = []
for line in input.splitlines():
output.append(map(int,line.split()))
return np.array(output)
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止在朱莉娅所拥有的:
function parse(input)
nrow = ncol = 0
# Count first
for row=split(input,'\n')
nrow += 1
ncol = max(ncol,length(split(row)))
end
output = zeros(Int64,(nrow,ncol))
for (i,row) in enumerate(split(input,'\n'))
for (j,word) in enumerate(split(row))
output[i,j] = int(word)
end
end
return output
end
Run Code Online (Sandbox Code Playgroud)
什么是朱莉娅版的"pythonic"叫做?无论是什么,我都不认为我这样做.我很确定有一种方法可以(1)不必两次传递数据,(2)不必如此具体地分配数组.我试了一下hcat/vcat,没有运气.
我欢迎解决这个问题的建议.我也有兴趣参考适当的Julia风格(julia-onic?)和一般语言使用实践.谢谢!