0

假设我有这个示例代码:

x = foo1(something1)
y = foo2(something2)

z = max(x, y)

我想通过使用线程来改善这段代码的执行时间(希望它有帮助,不是吗?)。我想让事情尽可能简单,所以基本上我想做的是创建两个同时工作的线程,分别计算foo1foo2.

我正在阅读一些关于线程的东西,但我发现它有点棘手,我不能为了做这么简单的事情而浪费太多时间。

4

4 回答 4

8

假设foo1foo2受 CPU 限制,线程不会提高执行时间......事实上,它通常会使情况变得更糟......有关更多信息,请参阅David Beazley 在 Global Interpreter Lock / Pycon2010 GIL 幻灯片上的 PyCon2010 演示文稿。此演示文稿内容丰富,我强烈推荐给任何尝试跨 CPU 内核分配负载的人。

提高性能的最佳方法是使用多处理模块

foo1()假设和之间不需要共享状态foo2(),这样做可以提高执行性能......

from multiprocessing import Process, Queue
import time

def foo1(queue, arg1):
    # Measure execution time and return the total time in the queue
    print "Got arg1=%s" % arg1
    start = time.time()
    while (arg1 > 0):
        arg1 = arg1 - 1
        time.sleep(0.01)
    # return the output of the call through the Queue
    queue.put(time.time() - start)

def foo2(queue, arg1):
    foo1(queue, 2*arg1)

_start = time.time()
my_q1 = Queue()
my_q2 = Queue()

# The equivalent of x = foo1(50) in OP's code
p1 = Process(target=foo1, args=[my_q1, 50])
# The equivalent of y = foo2(50) in OP's code
p2 = Process(target=foo2, args=[my_q2, 50])

p1.start(); p2.start()
p1.join(); p2.join()
# Get return values from each Queue
x = my_q1.get()
y = my_q2.get()

print "RESULT", x, y
print "TOTAL EXECUTION TIME", (time.time() - _start)

在我的机器上,这会导致:

mpenning@mpenning-T61:~$ python test.py 
Got arg1=100
Got arg1=50
RESULT 0.50578212738 1.01011300087
TOTAL EXECUTION TIME 1.02570295334
mpenning@mpenning-T61:~$ 
于 2011-12-08T12:51:31.813 回答
0

首先阅读此处的文档以了解以下代码:

import threading

def foo1(x=0):
    return pow(x, 2)

def foo2(y=0):
    return pow(y, 3)

thread1 = threading.Thread(target=foo1, args=(3))
thread2 = threading.Thread(target=foo2, args=(2))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
于 2011-12-08T12:39:18.677 回答
0

您可以使用 pythonthread模块或新Threading模块,但是使用thread模块在语法上更简单,

#!/usr/bin/python

import thread
import time

# Define a function for the thread
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print "%s: %s" % ( threadName, time.ctime(time.time()) )

# Create two threads as follows
try:
   thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print "Error: unable to start thread"

while 1:
   pass

将输出,

Thread-1: Thu Jan 22 15:42:17 2009
Thread-1: Thu Jan 22 15:42:19 2009
Thread-2: Thu Jan 22 15:42:19 2009
Thread-1: Thu Jan 22 15:42:21 2009
Thread-2: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:25 2009
Thread-2: Thu Jan 22 15:42:27 2009
Thread-2: Thu Jan 22 15:42:31 2009
Thread-2: Thu Jan 22 15:42:35 2009

从这里阅读更多信息,Python - 多线程编程

于 2011-12-08T12:34:34.100 回答
-1

它不会有帮助。阅读 Python 常见问题解答。

于 2011-12-08T12:22:05.750 回答