Discuss / Python / 【求助,疑问】比较单线程与多线程操作的用时

【求助,疑问】比较单线程与多线程操作的用时

Topic source

根据上文所讲,上了锁之后,多线程中一个线程执行完后才进行下一个线程,因此我猜想其效率应该和上了锁的单线程是一样的吧,因此我编写了如下程序,单线程实现存取2000000次,多线程(2线程)各实现存取1000000次,这样从工作量来讲,应该是一样的,在命令行模式下运行发现每次操作多线程都比单线程用时多1倍左右,请问这是为什么?

import time, threading
print('本程序将进行比较,单线程和多线程的用时')
balance=0
lock = threading.Lock()

def change_it(n):
    global balance
    lock.acquire()
    try:
        balance = balance + n
        balance = balance - n
    finally:
            lock.release()

def run_thread1(n):
    for i in range(2000000):
        change_it(n)

def run_thread2(n):
    for i in range(1000000):
        change_it(n)

balance=0
start1 = time.time()
td = threading.Thread(target=run_thread1, args=(5,))
td.start()
td.join()
end1 = time.time()
timeuse1=end1-start1
print('\nbalance最终结果:%d        单线程用时:%f 秒'%(balance,timeuse1))

balance=0
start2 = time.time()
t1 = threading.Thread(target=run_thread2, args=(5,))
t2 = threading.Thread(target=run_thread2, args=(5,))
t1.start()
t2.start()
t1.join()
t2.join()
end2 = time.time()
timeuse2=end2-start2
print('\nbalance最终结果:%d        多线程用时:%f 秒'%(balance,timeuse2))

问题2: 如果我编写了如下程序,算不算单线程?

下面的用时比上面的单线程和多线程更少,比上面的单线程又少了一倍,那多线程的效率到底体现在哪里?

import time, threading
print('下面的操作属不属于单线程?为什么?')
balance1=0
def change_it1(n):
    global balance1
    balance1 = balance1 + n
    balance1 = balance1 - n

start1 = time.time()
for i in range(2000000):
    change_it1(5)
end1 = time.time()
timeuse1=end1-start1
print('balance1最终结果:%d        单线程用时:%f 秒'%(balance1,timeuse1))

刚才我发的用的是一个网友的方法,即在change_it函数里面加锁,单线程用时1s多,双线程用时2s多,现在我用廖老师的方法来写比较用时函数,即在run_thread函数里面加锁,单线程用时0.1s多,双线程用时0.2s多......为什么同样是加锁,加锁的地方不一样,程序跑的时间会相差10倍之多??

import time, threading
print('本程序将进行比较,单线程和多线程的用时')
balance=0
lock = threading.Lock()

def change_it(n):
    global balance
    balance = balance + n
    balance = balance - n


def run_thread1(n):
    for i in range(200000):
        lock.acquire()
        try:
            change_it(n)
        finally:
            lock.release()

def run_thread2(n):
    for i in range(100000):
        lock.acquire()
        try:
            change_it(n)
        finally:
            lock.release()

balance=0
start1 = time.time()
td = threading.Thread(target=run_thread1, args=(5,))
td.start()
td.join()
end1 = time.time()
timeuse1=end1-start1
print('\nbalance最终结果:%d        单线程用时:%f 秒'%(balance,timeuse1))

balance=0
start2 = time.time()
t1 = threading.Thread(target=run_thread2, args=(5,))
t2 = threading.Thread(target=run_thread2, args=(5,))
t1.start()
t2.start()
t1.join()
t2.join()
end2 = time.time()
timeuse2=end2-start2
print('\nbalance最终结果:%d        多线程用时:%f 秒'%(balance,timeuse2))

蓝萧Bingle

#3 Created at ... [Delete] [Delete and Lock User]

你的两个程序,一个循环100万次,一个循环10万次,当然时间差了10倍。 至于双线程执行是单线程差不多2倍,我在自己机器测试了一下,不是2倍,下面是结果: 本程序将进行比较,单线程和多线程的用时

balance最终结果:0 单线程用时:0.095876 秒

balance最终结果:0 多线程用时:0.099555 秒

结果显示,多线程由于要进行锁的等待,所以用时稍微多一些。

Pre-Battier

#4 Created at ... [Delete] [Delete and Lock User]

单线程你可以不加锁啊。。。更快

李福杰515

#5 Created at ... [Delete] [Delete and Lock User]

我运行最上面第一个的结果(两次运行):

本程序将进行比较,单线程和多线程的用时

balance最终结果:0 单线程用时:2.388602 秒

balance最终结果:0 多线程用时:3.130102 秒

本程序将进行比较,单线程和多线程的用时

balance最终结果:0 单线程用时:2.470650 秒

balance最终结果:0 多线程用时:3.081061 秒

运行最下面的程序结果(把那个循环数目都加了一个零,确保次数和前面相同):

本程序将进行比较,单线程和多线程的用时

balance最终结果:0 单线程用时:2.442637 秒

balance最终结果:0 多线程用时:2.881924 秒 本程序将进行比较,单线程和多线程的用时

balance最终结果:0 单线程用时:1.692133 秒

balance最终结果:0 多线程用时:2.622757 秒

总的来说,多线程勇士确实比单线程用时多(这是在有加锁的情况下),如果单线程不加锁的话运行时间会更快!


  • 1

Reply