并发编程和并行编程有什么区别?我问谷歌,但没有找到任何帮助我理解这种差异的东西.你能给我一个例子吗?
现在我发现了这个解释:http://www.linux-mag.com/id/7411 - 但"并发性是程序的属性"vs"并行执行是机器的属性"对我来说还不够 - 我还不能说什么是什么.
我明白它们本质上都是一样的,但在风格方面,哪个更好(更多Pythonic)用于创建空列表或字典?
为了使我的代码更"pythonic"和更快,我使用"多处理"和一个map函数发送它a)函数和b)迭代范围.
植入的解决方案(即直接在范围tqdm.tqdm(范围(0,30))上调用tqdm不适用于多处理(如下面的代码所示).
进度条显示从0到100%(当python读取代码?)但它不指示map函数的实际进度.
如何显示一个进度条,指示"地图"功能在哪一步?
from multiprocessing import Pool
import tqdm
import time
def _foo(my_number):
square = my_number * my_number
time.sleep(1)
return square
if __name__ == '__main__':
p = Pool(2)
r = p.map(_foo, tqdm.tqdm(range(0, 30)))
p.close()
p.join()
Run Code Online (Sandbox Code Playgroud)
欢迎任何帮助或建议......
我的项目是使用OpenMP在C中做一些并行的算法.现在我想用Python做同样的项目.有没有类似于openmp for python的东西?
可能重复:
如何并行化一个简单的python循环?
我是Python的新手(使用Python 3.2),我有一个关于并行化的问题.我有一个for循环,我希望在Python 3.2中使用"多处理"并行执行:
def computation:
global output
for x in range(i,j):
localResult = ... #perform some computation as a function of i and j
output.append(localResult)
Run Code Online (Sandbox Code Playgroud)
总的来说,我想在i = 0到j = 100的范围内执行此计算.因此,我想创建一些进程,每个进程使用总范围的子域调用函数"calculate".有关于如何做到这一点的任何想法?有没有比使用多处理更好的方法?
更具体地说,我想执行域分解,我有以下代码:
from multiprocessing import Pool
class testModule:
def __init__(self):
self
def computation(self, args):
start, end = args
print('start: ', start, ' end: ', end)
testMod = testModule()
length = 100
np=4
p = Pool(processes=np)
p.map(yes tMod.computation, [(length, startPosition, length//np) for startPosition in range(0, length, length//np)])
Run Code Online (Sandbox Code Playgroud)
我收到一条提到PicklingError的错误消息.任何想法可能是这里的问题?
python parallel-processing pickle multiprocessing python-3.x
我有一个解析文件的功能,然后使用SQLAlchemy将数据插入MySQL。我一直在按的结果顺序运行该函数,os.listdir()并且一切正常。
因为大部分时间都花在读取文件和写入数据库上,所以我想使用多处理来加快处理速度。这是我的pseduocode,因为实际代码太长:
def parse_file(filename):
f = open(filename, 'rb')
data = f.read()
f.close()
soup = BeautifulSoup(data,features="lxml", from_encoding='utf-8')
# parse file here
db_record = MyDBRecord(parsed_data)
session.add(db_record)
session.commit()
pool = mp.Pool(processes=8)
pool.map(parse_file, ['my_dir/' + filename for filename in os.listdir("my_dir")])
Run Code Online (Sandbox Code Playgroud)
我看到的问题是脚本挂起并且永远无法完成。我通常将63条记录中的48条放入数据库。有时更多,有时更少。
我已经尝试过pool.close()并结合使用pool.join(),但似乎都没有帮助。
如何完成此脚本?我究竟做错了什么?我在Linux机器上使用Python 2.7.8。
我正在创建一个进程池,每个进程池都需要在主程序中存在的矩阵的不同部分进行编写.不存在覆盖信息的担心,因为每个过程将与矩阵的不同行一起工作.如何使矩阵在流程中可写?
该程序是教授指定我的矩阵乘数,必须进行多处理.它将为计算机的每个核心创建一个进程.主程序将矩阵的不同部分发送给进程,然后他们将计算它们,然后它们将以一种方式返回它们,我可以识别哪个响应对应于它所基于的行.
我正在从 MATLAB 迁移到 Python,主要是因为 Python 中有大量有趣的机器学习包可用。但让我感到困惑的问题之一是并行处理。特别是,我想从磁盘中for循环读取数千个文本文件,并且我想并行执行。在 MATLAB 中,使用parfor而不是for可以解决问题,但到目前为止我还没有弄清楚如何在 python 中做到这一点。这是我想要做的一个例子。我想读取 N 个文本文件,将它们组成一个 N1xN2 数组,并将每个文件保存到一个 NxN1xN2 numpy 数组中。这个数组将是我从函数返回的内容。假设文件名是file0001.dat,file0002.dat等,我喜欢并行化的代码如下:
import numpy as np
N=10000
N1=200
N2=100
result = np.empty([N, N1, N2])
for counter in range(N):
t_str="%.4d" % counter
filename = 'file_'+t_str+'.dat'
temp_array = np.loadtxt(filename)
temp_array.shape=[N1,N2]
result[counter,:,:]=temp_array
Run Code Online (Sandbox Code Playgroud)
我在集群上运行代码,所以我可以使用许多处理器来完成这项工作。因此,任何关于哪种并行化方法更适合我的任务(如果有多个)的评论都是最受欢迎的。
注意:我知道这篇文章,但在那篇文章中,只有out1, out2,out3变量需要担心,并且它们已被明确用作要并行化的函数的参数。但是在这里,我有许多 2D 数组应该从文件中读取并保存到 3D 数组中。所以,这个问题的答案对我的情况来说不够通用(或者我是这样理解的)。
我在 python 中使用 joblib 中的 Parallel 来训练 CNN。代码结构如下:
crf = CRF()
with Parallel(n_jobs=num_cores) as pal_worker:
for epoch in range(n):
temp = pal_worker(delayed(crf.runCRF)(x[i],y[i]) for i in range(m))
Run Code Online (Sandbox Code Playgroud)
代码可以成功运行 1 或 2 个 epoch,然后发生错误说(我列出了我认为重要的要点):
......
File "/data_shared/Docker/tsun/software/anaconda3/envs/pytorch04/lib/python3.5/site-packages/joblib/numpy_pickle.py", line 104, in write_array
pickler.file_handle.write(chunk.tostring('C'))
OSError: [Errno 28] No space left on device
"""
The above exception was the direct cause of the following exception:
return future.result(timeout=timeout)
File
......
_pickle.PicklingError: Could not pickle the task to send it to the workers.
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为磁盘有很多空间,程序可以成功运行 1 或 2 …
我还处于 Python 学习的早期阶段。如果这个问题听起来很愚蠢,请提前道歉。
我有这组数据(表格格式),我想向其中添加几个计算列。基本上我有一些位置 lon/lat 和目的地 lon/lat,以及各自的数据时间,我正在计算每对之间的平均速度。
示例数据如下所示:
print(data_all.head(3))
id lon_evnt lat_evnt event_time \
0 1 -179.942833 41.012467 2017-12-13 21:17:54
1 2 -177.552817 41.416400 2017-12-14 03:16:00
2 3 -175.096567 41.403650 2017-12-14 09:14:06
dest_data_generate_time lat_dest lon_dest \
0 2017-12-13 22:33:37.980 37.798599 -121.292193
1 2017-12-14 04:33:44.393 37.798599 -121.292193
2 2017-12-14 10:33:51.629 37.798599 -121.292193
address_fields_dest \
0 {'address': 'Nestle Way', 'city': 'Lathrop...
1 {'address': 'Nestle Way', 'city': 'Lathrop...
2 {'address': 'Nestle Way', 'city': 'Lathrop...
Run Code Online (Sandbox Code Playgroud)
然后我将 lon/lat 压缩在一起:
data_all['ping_location'] = list(zip(data_all.lon_evnt, data_all.lat_evnt))
data_all['destination'] = …Run Code Online (Sandbox Code Playgroud) python ×9
pickle ×2
concurrency ×1
dictionary ×1
for-loop ×1
joblib ×1
list ×1
matrix ×1
mysql ×1
pandas ×1
performance ×1
progress-bar ×1
python-3.x ×1
tqdm ×1