Python数组求和vs MATLAB

2024-09-30 14:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在慢慢地转向Python,我想做一个简单的测试来比较简单数组求和的性能。我生成一个随机的1000x1000数组,并在这个数组中的每个值上加一个。在

这里是我用Python编写的脚本:

import time

import numpy
from numpy.random import random

def testAddOne(data):
    """
    Test addOne
    """
    return data + 1

i = 1000
data = random((i,i))
start = time.clock()
for x in xrange(1000): 
    testAddOne(data)

stop = time.clock()
print stop - start

以及我在MATLAB中的功能:

^{pr2}$

Python需要2.77-2.79秒,与MATLAB函数相同(实际上Numpy给我留下了很深的印象!)。要使用多线程处理,我需要对Python脚本进行哪些更改?我不能用MATLAB,因为我没有工具箱。在


Tags: fromimportnumpy脚本datatimedefrandom
1条回答
网友
1楼 · 发布于 2024-09-30 14:33:13

Python中的Multi线程只在线程被阻塞的情况下有用,例如在获取输入时,这里不是这种情况(有关更多详细信息,请参阅this question的答案)。然而,多处理在Python中很容易实现。多处理一般包括here。在

下面是一个与您的示例类似的程序

import time
import numpy
from numpy.random import random
from multiprocessing import Process

def testAddOne(data):
    return data + 1

def testAddN(data,N):
    # print "testAddN", N
    for x in xrange(N): 
        testAddOne(data)

if __name__ == '__main__':
    matrix_size = 1000
    num_adds = 10000
    num_processes = 4

    data = random((matrix_size,matrix_size))

    start = time.clock()
    if num_processes > 1:
        processes = [Process(target=testAddN, args=(data,num_adds/num_processes))
                     for i in range(num_processes)]
        for p in processes:
            p.start()
        for p in processes:
            p.join()
    else:
        testAddN(data,num_adds)

    stop = time.clock()
    print "Elapsed", stop - start

下面是一个使用pool of worker processes将1连续添加到不同矩阵的更有用的示例。在

^{pr2}$

在本例中,testAddN中的代码实际上对调用testAddOne的结果做了一些事情。您可以取消对print语句的注释,以检查是否正在执行一些有用的工作。在

在这两种情况下,我都将添加的总数量更改为10000;添加的数量越少,启动流程的成本就越大(但是您可以尝试参数)。你也可以用num_processes做实验。在我的机器上,我发现与num_processes=1在同一个进程中运行相比,我得到了2倍的加速,产生了四个带有num_processes=4的进程。在

相关问题 更多 >