我正在尝试编写一个与a同时应用函数的应用程序multiprocessing.Pool.我希望这个函数是一个实例方法(所以我可以在不同的子类中以不同的方式定义它).这似乎不可能; 正如我在其他地方所了解的那样,显然绑定的方法无法被腌制.那么为什么multiprocessing.Process以绑定方法作为目标工作开始?以下代码:
import multiprocessing
def test1():
print "Hello, world 1"
def increment(x):
return x + 1
class testClass():
def process(self):
process1 = multiprocessing.Process(target=test1)
process1.start()
process1.join()
process2 = multiprocessing.Process(target=self.test2)
process2.start()
process2.join()
def pool(self):
pool = multiprocessing.Pool(1)
for answer in pool.imap(increment, range(10)):
print answer
print
for answer in pool.imap(self.square, range(10)):
print answer
def test2(self):
print "Hello, world 2"
def square(self, x):
return x * x
def main():
c = testClass()
c.process()
c.pool()
if __name__ == "__main__": …Run Code Online (Sandbox Code Playgroud) 我用Python编写了一个工作程序,基本上解析了一批二进制文件,将数据提取到数据结构中.每个文件大约需要一秒钟来解析,这意味着数千个文件的小时数.我已经成功实现了具有可调整线程数的批处理解析方法的线程版本.我在具有不同线程数的100个文件上测试了该方法,每次运行计时.以下是结果(0个线程指的是我原来的预线程代码,1个线程到新版本运行,产生一个线程).
0 threads: 83.842 seconds
1 threads: 78.777 seconds
2 threads: 105.032 seconds
3 threads: 109.965 seconds
4 threads: 108.956 seconds
5 threads: 109.646 seconds
6 threads: 109.520 seconds
7 threads: 110.457 seconds
8 threads: 111.658 seconds
Run Code Online (Sandbox Code Playgroud)
虽然生成一个线程比使主线程完成所有工作所带来的性能提升很小,但增加线程数实际上会降低性能.我本来希望看到性能提升,至少最多四个线程(每个机器核心一个).我知道线程有相关的开销,但我不认为这对于一位数的线程来说太重要了.
我听说过"全局解释器锁定",但是当我最多移动到四个线程时,我确实看到了相应的内核数量 - 两个线程两个核心在解析期间显示活动,依此类推.
我还测试了一些不同版本的解析代码,看看我的程序是否是IO绑定的.它似乎不是; 只读文件需要相对较小的时间; 处理文件几乎就是全部.如果我不执行IO并处理已经读取的文件版本,我添加第二个线程会损害性能,第三个线程会略微改进它.我只是想知道为什么我不能利用我的计算机的多核来加快速度.请发布我可以澄清的任何问题或方法.
我刚刚在我的程序中发现了一个与使用Python的多处理模块相关的奇怪错误.当我从我的机器上的源程序运行程序时,一切正常.但是我一直在使用pyinstaller将它构建成可执行文件,并且由于某种原因,当我运行从我的代码构建的可执行文件时,多处理的行为会发生巨大变化.具体来说,当我尝试运行代码的多处理部分时,而不是按照它应该执行的操作,会弹出一个似乎是我程序主窗口的副本,每个进程一个.更糟糕的是,如果他们手动关闭,他们会重新打开,大概是因为他们是多处理的一部分.没有打印错误消息,一旦创建,所有窗口就坐在那里什么都不做.可能会发生什么导致这种情况?
再一次,我对unicode问题非常困惑.我无法弄清楚如何成功使用unicodedata.normalize按预期转换非ASCII字符.例如,我想转换字符串
u"Cœur"
Run Code Online (Sandbox Code Playgroud)
至
u"Coeur"
Run Code Online (Sandbox Code Playgroud)
我很确定unicodedata.normalize是这样做的方法,但我不能让它工作.它只是保持字符串不变.
>>> s = u"Cœur"
>>> unicodedata.normalize('NFKD', s) == s
True
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
python unicode normalization unicode-normalization python-2.7
我试图用subprocess.call在Python中运行外部应用程序.从我读过的内容来看,除非你调用Popen.wait,否则subprocess.call不应该阻塞,但对我来说它是阻塞的,直到外部应用程序退出.我该如何解决?
我只是在分析我的Python程序,看看为什么它看起来很慢.我发现它的大部分运行时间花费在inspect.stack()方法上(用于输出带模块和行号的调试消息),每次调用0.005秒.这似乎相当高; 是inspect.stack真的这种缓慢的,或可能的东西是错误与我的计划?
我正在努力的游戏中遇到棘手的问题.我正在使用Pygame来开发它.我碰巧是那些从不使用默认__dict__对象变量的开发人员之一; 我总是定义__slots__澄清对象可以拥有的变量(我有一个类方法,它读取插槽以确定配置文件中所需的变量).
无论如何,我只是意识到这种努力在我的一些班级中没有奏效; 它们仍然有一个__dict__变量,可以分配任意属性,即使它们明确定义了它们__slots__.我认为这是因为它们继承自pygame.sprite.Sprite,它有一个__dict__.如果是这种情况,我该如何抑制这个字典的创建呢?(我虽然明确定义__slots__应该)或者我可能弄错了原因?感谢您的任何见解; 通过搜索很难找到有关此特定问题的信息.
我正在尝试编写一个可以在远程Linux服务器上移动和复制文件的Python脚本.但是,我不能假设每个运行脚本的人(在Windows上)都会将此服务器映射到同一个字母.我想通过其网络URL(驱动器号映射到的网络URL)来访问服务器,而不是提示用户输入正确的字母.因此,例如,如果我已映射服务器的URL
\\name-of-machine.site.company.com
Run Code Online (Sandbox Code Playgroud)
要驱动S:\,我想以驱动器号不可知的方式访问文件S:\ var\SomeFile.txt.我环顾四周,一般建议似乎是使用UNC表示法:
f = open(r"\\name-of-machine.site.company.com\var\SomeFile.txt", "w")
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试这个,一个IOError说没有这样的文件或目录.如果我尝试使用服务器的IP地址(而不是真实地址,但类似):
f = open(r"\\10.1.123.149\var\SomeFile.txt", "w")
Run Code Online (Sandbox Code Playgroud)
经过长时间的停顿后,我得到一个IO错误:"无效模式('w')或文件名".为什么这些符号不起作用,如何通过其URL访问此服务器(理想情况下,就像它是本地驱动器一样)?
我正在寻找一种方法将numpy中的字符串数组转换为它们以十六进制表示的整数.换句话说,阵列版本:
int("f040", 16)
Run Code Online (Sandbox Code Playgroud)
我可以通过调用arr.astype(numpy.int32)将字符串数组转换为整数base-10,但我看不到任何明显的方法将它们转换为base-16.有谁知道这样做的方法?
我已经在程序中跟踪到我用C语言编写的Python模块的内存泄漏,以有效地解析以ASCII十六进制表示的数组。(例如“ FF 39 00 FC ...”)
char* buf;
unsigned short bytesPerTable;
if (!PyArg_ParseTuple(args, "sH", &buf, &bytesPerTable))
{
return NULL;
}
unsigned short rowSize = bytesPerTable;
char* CArray = malloc(rowSize * sizeof(char));
// Populate CArray with data parsed from buf
ascii_buf_to_table(buf, bytesPerTable, rowSize, CArray);
int dims[1] = {rowSize};
PyObject* pythonArray = PyArray_SimpleNewFromData(1, (npy_intp*)dims, NPY_INT8, (void*)CArray);
return Py_BuildValue("(O)", pythonArray);
Run Code Online (Sandbox Code Playgroud)
我意识到numpy不知道释放为CArray分配的内存,从而导致内存泄漏。在对该问题进行了一些研究之后,在本文的注释建议下,我添加了以下行,该行应告诉数组它“拥有”它的数据,并在删除它时释放它。
PyArray_ENABLEFLAGS((PyArrayObject*)pythonArray, NPY_ARRAY_OWNDATA);
Run Code Online (Sandbox Code Playgroud)
但是我仍然遇到内存泄漏。我究竟做错了什么?如何使NPY_ARRAY_OWNDATA标志正常工作?
作为参考,ndarraytypes.h中的文档使它看起来应该可以工作:
/*
* If set, the array owns the data: it will be free'd when the array …Run Code Online (Sandbox Code Playgroud) python ×10
numpy ×2
python-2.7 ×2
c ×1
inspect ×1
io ×1
malloc ×1
memory-leaks ×1
performance ×1
pickle ×1
pygame ×1
unicode ×1