$ time foo
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$
Run Code Online (Sandbox Code Playgroud)
"真实","用户"和"系统"在时间输出中意味着什么?
在对我的应用进行基准测试时哪一个有意义?
并发和并行有什么区别?
赞赏的例子.
我写了一个Python程序,它作用于一个大的输入文件,创建了几百万个表示三角形的对象.算法是:
在打印三角形之前打印出完整的顶点列表的OFF的要求意味着在将输出写入文件之前我必须在内存中保存三角形列表.与此同时,由于列表的大小,我遇到了内存错误.
告诉Python我不再需要某些数据的最佳方法是什么,它可以被释放?
什么是全球解释器锁,为什么它是一个问题?
围绕从Python中删除GIL已经产生了很多噪音,我想知道为什么这么重要.我自己从未编写过编译器或解释器,所以不要节俭细节,我可能需要他们理解.
我正在学习如何使用Python中threading的multiprocessing模块和并行运行某些操作并加快我的代码.
我发现这很难(可能因为我没有任何理论背景)来理解一个threading.Thread()对象和一个对象之间的区别multiprocessing.Process().
此外,我并不完全清楚如何实例化一个作业队列,并且只有4个(例如)它们并行运行,而另一个则在执行之前等待资源释放.
我发现文档中的示例清晰,但不是很详尽; 一旦我尝试使事情复杂化,我就会收到许多奇怪的错误(比如一种无法腌制的方法,等等).
那么,我什么时候应该使用threading和multiprocessing模块?
您能否将我链接到一些资源,解释这两个模块背后的概念以及如何正确使用它们来完成复杂的任务?
python parallel-processing multithreading process multiprocessing
我发现pip在编译包时只使用单核.由于一些python包需要一些时间来构建使用pip,我想在机器上使用多核.使用Makefile时,我可以像下面这样执行命令:
make -j4
Run Code Online (Sandbox Code Playgroud)
我怎么能为pip做同样的事情?
我正在尝试使用caffe和python进行实时图像分类.我在一个过程中使用OpenCV从我的网络摄像头流式传输,并在一个单独的过程中,使用caffe对从网络摄像头拉出的帧执行图像分类.然后我将分类结果传回主线程以标注网络摄像头流.
问题是即使我有一个NVIDIA GPU并且正在执行GPU上的caffe预测,主线程也会变慢.通常没有做任何预测,我的网络摄像头流以30 fps运行; 但是,根据预测,我的网络摄像头流最多可获得15 fps.
我已经验证了caffe在执行预测时确实使用了GPU,而且我的GPU或GPU内存并没有最大化.我还验证了我的CPU内核在程序中的任何时候都没有达到最大限度.我想知道我是做错了什么,或者是否有办法让这两个过程真正分开.任何建议表示赞赏.这是我的代码供参考
class Consumer(multiprocessing.Process):
def __init__(self, task_queue, result_queue):
multiprocessing.Process.__init__(self)
self.task_queue = task_queue
self.result_queue = result_queue
#other initialization stuff
def run(self):
caffe.set_mode_gpu()
caffe.set_device(0)
#Load caffe net -- code omitted
while True:
image = self.task_queue.get()
#crop image -- code omitted
text = net.predict(image)
self.result_queue.put(text)
return
import cv2
import caffe
import multiprocessing
import Queue
tasks = multiprocessing.Queue()
results = multiprocessing.Queue()
consumer = Consumer(tasks,results)
consumer.start()
#Creating window and starting video capturer from camera
cv2.namedWindow("preview")
vc = cv2.VideoCapture(0)
#Try to …Run Code Online (Sandbox Code Playgroud) 在celeryd-multi的文档中,我们找到了这个例子:
# Advanced example starting 10 workers in the background:
# * Three of the workers processes the images and video queue
# * Two of the workers processes the data queue with loglevel DEBUG
# * the rest processes the default' queue.
$ celeryd-multi start 10 -l INFO -Q:1-3 images,video -Q:4,5 data
-Q default -L:4,5 DEBUG
Run Code Online (Sandbox Code Playgroud)
(从这里:http://docs.celeryproject.org/en/latest/reference/celery.bin.celeryd_multi.html#examples)
什么是一个实际的例子,说明为什么在一个主机上有多个工作程序处理相同的队列是好的,如上例所示?这不是设置并发性的原因吗?
更具体地说,以下两行(A和B)之间是否存在实际差异?:
A:
$ celeryd-multi start 10 -c 2 -Q data
Run Code Online (Sandbox Code Playgroud)
B:
$ celeryd-multi start 1 -c 20 …Run Code Online (Sandbox Code Playgroud) 简而言之
我想同时更改复杂的python对象,每个对象只由一个进程处理.我怎么能这样做(效率最高)?实施某种酸洗支持会有帮助吗?这会有效吗?
完整的问题
我有一个python数据结构ArrayDict,基本上由一个numpy数组和一个字典组成,并将任意索引映射到数组中的行.在我的例子中,所有键都是整数.
a = ArrayDict()
a[1234] = 12.5
a[10] = 3
print(a[1234]) #12.5
print(a[10]) # 3.0
print(a[1234] == a.array[a.indexDict[1234]]) #true
Run Code Online (Sandbox Code Playgroud)
现在我有多个这样的ArrayDicts并希望填写它们myMethod(arrayDict, params).由于myMethod价格昂贵,我想并行运行它.请注意,myMethod可能会添加许多行arrayDict.每个过程都会改变自己的过程ArrayDict.我不需要并发访问ArrayDicts.
在myMethod,我更改了条目arrayDict(即,我更改了内部numpy数组),我添加了条目arrayDict(也就是说,我向字典添加另一个索引并在内部数组中写入一个新值).最终,我希望能够在arrayDict内部numpy阵列变得太小时进行交换.这不会经常发生,如果没有更好的解决方案,我可以在程序的非并行部分执行此操作.即使没有阵列交换,我自己的尝试也没有成功.
我花了几天时间研究共享内存和python的多处理模块.由于我最终将在linux上工作,因此任务似乎相当简单:系统调用fork()允许有效地处理参数的副本.我的想法是ArrayDict在自己的进程中更改每个,返回对象的更改版本,并覆盖原始对象.为了节省内存并保存复制工作,我还使用了sharedmem数组来存储数据ArrayDict.我知道字典必须仍然被复制.
from sharedmem import sharedmem
import numpy as np
n = ... # length of …Run Code Online (Sandbox Code Playgroud) python ×7
benchmarking ×1
caffe ×1
celery ×1
celery-task ×1
celeryd ×1
concurrency ×1
fork ×1
gil ×1
gpgpu ×1
install ×1
java ×1
jython ×1
memory ×1
pickle ×1
pip ×1
process ×1
task-queue ×1
time ×1
unix ×1