import time # 堆代码 duidaima.com # List of numbers to process numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # Function to square a number def square_number(number): time.sleep(1) # Simulate a time-consuming task return number * number # Using a for loop to process each number squared_numbers = [] start_time = time.time() for number in numbers: squared_numbers.append(square_number(number)) end_time = time.time() print("Squared numbers:", squared_numbers) print("Time taken:", end_time - start_time, "seconds") # Time taken: 10.082990884780884 seconds这个脚本按顺序处理列表中的每个数字,由于 square_number 函数中的 time.sleep(1) 调用,每个数字耗时 1 秒。总执行时间为 10.1 秒。
import time from concurrent.futures import ThreadPoolExecutor # List of numbers to process numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # Function to square a number def square_number(number): time.sleep(1) # Simulate a time-consuming task return number * number # Using ThreadPoolExecutor for multithreading squared_numbers = [] start_time = time.time() with ThreadPoolExecutor(max_workers=10) as executor: results = executor.map(square_number, numbers) # Collect the results squared_numbers = list(results) end_time = time.time() print("Squared numbers:", squared_numbers) print("Time taken:", end_time - start_time, "seconds") # Time taken: 2.0257720947265625 seconds在这个优化的脚本中,我们使用 ThreadPoolExecutor 创建一个线程池。executor.map 函数将 square_number 函数分布到线程中,以并行方式处理数字。通过将 max_workers 设置为 5,我们允许最多 5 个线程同时运行,这应该会显著减少总处理时间。请随意调整 max_workers 参数,以找到特定用例的最佳线程数。
模拟:同时运行多个模拟或蒙特卡洛实验。
import time from concurrent.futures import ThreadPoolExecutor, as_completed # Decorator to add multithreading def multithreaded(max_workers=5): def decorator(func): def wrapper(*args, **kwargs): with ThreadPoolExecutor(max_workers=max_workers) as executor: future_to_args = {executor.submit(func, arg): arg for arg in args[0]} results = [] for future in as_completed(future_to_args): arg = future_to_args[future] try: result = future.result() except Exception as exc: print(f'{arg} generated an exception: {exc}') else: results.append(result) return results return wrapper return decorator # Function to square a number @multithreaded(max_workers=5) def square_number(number): time.sleep(1) # Simulate a time-consuming task return number * number # List of numbers to process numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 堆代码 duidaima.com # Using the decorated function start_time = time.time() squared_numbers = square_number(numbers) end_time = time.time() print("Squared numbers:", squared_numbers) print("Time taken:", end_time - start_time, "seconds")
使用装饰器处理多线程不仅简化了代码,还使其更可重用和更清晰。你可以轻松地将 @multithreaded 装饰器应用于任何需要并行执行的函数,为优化你的 Python 代码提供了一种灵活而强大的方式。