当前位置: 代码迷 >> python >> 使用循环打印可以减慢循环速度
  详细解决方案

使用循环打印可以减慢循环速度

热度:27   发布时间:2023-06-19 09:15:34.0

循环使用print会使循环变慢。 打印某些内容(我尝试过Hello! )需要 100次,耗时约2秒钟,没有它,则需要0.0秒。 我使用模块time准确地捕获了time 这是一个打印出来的循环,并显示最后花费的时间:

import time

t = time.time()
for _ in range(100):
    print("Hello! ",end = "")

print("\n",time.time()-t)

输出:

 Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! 1.9912450313568115 

这是另一个循环,该循环只是将字符串添加到变量中,并且花费0.0秒

import time

t = time.time()
output = ""
for _ in range(100):
    output += "Hello! "

print(time.time()-t)

输出:

 0.0 

我尝试添加更多操作,但仍然需要0.0秒。 例:

import time

t = time.time()
output,num,count,abc = "",0,30,"H"
for _ in range(100):
    output += "Hello! "
    num += 10000
    count += 10000000
    abc += "Hello Guys!"

print(time.time()-t)




为什么print减慢循环速度,如何解决此问题?

print()将减慢您的循环。 这是因为您每次调用print()时都会进行系统调用和IO操作。 系统调用消耗大量CPU周期,并且涉及CPU上下文切换。 IO操作将在一段时间内阻塞进程的主线程。

因此,显而易见的解决方案是消除或减少print()调用的数量。

如果确实需要一种机制来了解循环的当前迭代计数,则可以使用多线程来实现这一点。 但是仍然可能涉及系统调用和线程上下文切换。 但是我想它会比print()还要快。

技巧是在主线程中打印进度时在后台线程中执行循环。 这样,调用print()的IO操作不会阻塞运行循环的线程。 为了进一步优化,您只能在用户按下某个键时打印进度。

import threading

lock = threading.Lock()
count = 0

def your_method_with_a_loop():
    global count
    with open("f.txt","w") as f:
        for q in range(1000000):
            f.write(str(q)+"\n")
            #your_logic_here
            #....
            lock.acquire()
            count = count + 1
            lock.release()

#Run the loop in a background thread
t1 = threading.Thread(target=your_method_with_a_loop)
t1.start()

while t1.isAlive():
    print("Press enter to see current loop iteration count\n")
    #use raw_input() instead if your are using python 2.x.
    input() #Remove this line if you want to print progress continuously.
    lock.acquire() 
    current_count = count
    lock.release()
    print("Current loop iteration count is ",count,"\n")

该解决方案通过两种方式改善了情况

  1. 不在工作线程上执行IO操作。 是的,使用锁涉及系统调用。 但是它仍然比IO块更快。

  2. 假设python解释器使用futex来实现锁,那么获取和释放锁的成本非常慢,因为与工作线程相比,主线程很少持有该锁。

  相关解决方案