在循环中使用print
会使循环变慢。打印 (我尝试过Hello!
) 100次大约需要2秒钟,没有它,则需要0.0秒。我使用模块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
会减慢循环速度,如何解决这个问题?
答案 0 :(得分:1)
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")
此解决方案通过两种方式改善了情况
不在工作线程上执行IO操作。是的,使用锁涉及系统调用。但这仍然比IO块还要快。
假定python解释器使用futex
来实现锁,那么获取和释放锁的成本非常慢,因为与工作线程相比,主线程很少持有该锁。 / p>