|  |  |  | @ -0,0 +1,109 @@ | 
			
		
	
		
			
				
					|  |  |  |  | import yfinance as yf | 
			
		
	
		
			
				
					|  |  |  |  | import numpy as np | 
			
		
	
		
			
				
					|  |  |  |  | from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor | 
			
		
	
		
			
				
					|  |  |  |  | import asyncio | 
			
		
	
		
			
				
					|  |  |  |  | import time | 
			
		
	
		
			
				
					|  |  |  |  | import functools | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #################################################################### | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # 获取股票数据(I/O密集型任务) | 
			
		
	
		
			
				
					|  |  |  |  | def fetch_stock_data(stock): | 
			
		
	
		
			
				
					|  |  |  |  |     print(f"Fetching data for {stock}") | 
			
		
	
		
			
				
					|  |  |  |  |     data = yf.download(stock, start="2020-01-01", end="2023-01-01",auto_adjust=False) | 
			
		
	
		
			
				
					|  |  |  |  |     return data['Close'].values | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # 异步获取股票数据 | 
			
		
	
		
			
				
					|  |  |  |  | async def async_fetch_stock_data(stock): | 
			
		
	
		
			
				
					|  |  |  |  |     print(f"Fetching data for {stock}") | 
			
		
	
		
			
				
					|  |  |  |  |     data = await asyncio.to_thread(yf.download, stock, start="2020-01-01", end="2023-01-01",auto_adjust=False) | 
			
		
	
		
			
				
					|  |  |  |  |     return data['Close'].values | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # 傅里叶变换(计算密集型任务) | 
			
		
	
		
			
				
					|  |  |  |  | def fourier_transform(data): | 
			
		
	
		
			
				
					|  |  |  |  |     print("Performing Fourier Transform") | 
			
		
	
		
			
				
					|  |  |  |  |     fft_data = np.fft.fft(data) | 
			
		
	
		
			
				
					|  |  |  |  |     return np.abs(fft_data) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def timeit(message): | 
			
		
	
		
			
				
					|  |  |  |  |     def decorator(func): | 
			
		
	
		
			
				
					|  |  |  |  |         @functools.wraps(func) | 
			
		
	
		
			
				
					|  |  |  |  |         def sync_wrapper(*args, **kwargs): | 
			
		
	
		
			
				
					|  |  |  |  |             start_time = time.time() | 
			
		
	
		
			
				
					|  |  |  |  |             result = func(*args, **kwargs) | 
			
		
	
		
			
				
					|  |  |  |  |             end_time = time.time() | 
			
		
	
		
			
				
					|  |  |  |  |             print(f"{message}: {end_time - start_time:.2f} seconds") | 
			
		
	
		
			
				
					|  |  |  |  |             return result | 
			
		
	
		
			
				
					|  |  |  |  |         async def async_wrapper(*args, **kwargs): | 
			
		
	
		
			
				
					|  |  |  |  |             start_time = time.time() | 
			
		
	
		
			
				
					|  |  |  |  |             result = await func(*args, **kwargs) | 
			
		
	
		
			
				
					|  |  |  |  |             end_time = time.time() | 
			
		
	
		
			
				
					|  |  |  |  |             print(f"{message}: {end_time - start_time:.2f} seconds") | 
			
		
	
		
			
				
					|  |  |  |  |             return result | 
			
		
	
		
			
				
					|  |  |  |  |         if asyncio.iscoroutinefunction(func): | 
			
		
	
		
			
				
					|  |  |  |  |             return async_wrapper | 
			
		
	
		
			
				
					|  |  |  |  |         else: | 
			
		
	
		
			
				
					|  |  |  |  |             return sync_wrapper | 
			
		
	
		
			
				
					|  |  |  |  |     return decorator | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #################################################################### | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # 股票列表 | 
			
		
	
		
			
				
					|  |  |  |  | stocks = ['AAPL', 'MSFT', 'GOOG'] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # 串行执行 | 
			
		
	
		
			
				
					|  |  |  |  | @timeit("串行执行") | 
			
		
	
		
			
				
					|  |  |  |  | def serial_execution(): | 
			
		
	
		
			
				
					|  |  |  |  |     for stock in stocks: | 
			
		
	
		
			
				
					|  |  |  |  |         data = fetch_stock_data(stock) | 
			
		
	
		
			
				
					|  |  |  |  |         fft_data = fourier_transform(data) | 
			
		
	
		
			
				
					|  |  |  |  |         # 可视化(等等...) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # 多线程执行(优化 I/O 密集型任务) | 
			
		
	
		
			
				
					|  |  |  |  | @timeit("多线程执行") | 
			
		
	
		
			
				
					|  |  |  |  | def threaded_execution(): | 
			
		
	
		
			
				
					|  |  |  |  |     with ThreadPoolExecutor(max_workers=3) as executor: | 
			
		
	
		
			
				
					|  |  |  |  |         data_list = list(executor.map(fetch_stock_data, stocks)) | 
			
		
	
		
			
				
					|  |  |  |  |     for data in data_list: | 
			
		
	
		
			
				
					|  |  |  |  |         fft_data = fourier_transform(data) | 
			
		
	
		
			
				
					|  |  |  |  |         # 可视化(等等...) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # 多进程执行(优化计算密集型任务) | 
			
		
	
		
			
				
					|  |  |  |  | @timeit("多进程执行") | 
			
		
	
		
			
				
					|  |  |  |  | def multiprocessing_execution(): | 
			
		
	
		
			
				
					|  |  |  |  |     with ProcessPoolExecutor(max_workers=3) as executor: | 
			
		
	
		
			
				
					|  |  |  |  |         data_list = list(executor.map(fetch_stock_data, stocks)) | 
			
		
	
		
			
				
					|  |  |  |  |     with ProcessPoolExecutor(max_workers=3) as executor: | 
			
		
	
		
			
				
					|  |  |  |  |         fft_data_list = list(executor.map(fourier_transform, data_list)) | 
			
		
	
		
			
				
					|  |  |  |  |         # 可视化(等等...) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # 异步执行(优化 I/O 密集型任务) | 
			
		
	
		
			
				
					|  |  |  |  | @timeit("异步执行") | 
			
		
	
		
			
				
					|  |  |  |  | async def async_execution(): | 
			
		
	
		
			
				
					|  |  |  |  |     tasks = [async_fetch_stock_data(stock) for stock in stocks] | 
			
		
	
		
			
				
					|  |  |  |  |     data_list = await asyncio.gather(*tasks) | 
			
		
	
		
			
				
					|  |  |  |  |     for data in data_list: | 
			
		
	
		
			
				
					|  |  |  |  |         fft_data = fourier_transform(data) | 
			
		
	
		
			
				
					|  |  |  |  |         # 可视化(等等...) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | @timeit("混合执行") | 
			
		
	
		
			
				
					|  |  |  |  | async def mixed_execution(): | 
			
		
	
		
			
				
					|  |  |  |  |     tasks = [async_fetch_stock_data(stock) for stock in stocks] | 
			
		
	
		
			
				
					|  |  |  |  |     data_list = await asyncio.gather(*tasks) | 
			
		
	
		
			
				
					|  |  |  |  |     with ProcessPoolExecutor(max_workers=3) as executor: | 
			
		
	
		
			
				
					|  |  |  |  |         fft_data_list = list(executor.map(fourier_transform, data_list)) | 
			
		
	
		
			
				
					|  |  |  |  |         # 可视化(等等...) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | if __name__ == "__main__": | 
			
		
	
		
			
				
					|  |  |  |  |     print("串行执行:");    serial_execution() | 
			
		
	
		
			
				
					|  |  |  |  |     print("\n多线程执行:") ;     threaded_execution() | 
			
		
	
		
			
				
					|  |  |  |  |     print("\n多进程执行:");    multiprocessing_execution() | 
			
		
	
		
			
				
					|  |  |  |  |     print("\n异步执行:");    asyncio.run(async_execution()) | 
			
		
	
		
			
				
					|  |  |  |  |     print("\n混合执行:") ;    asyncio.run(mixed_execution()) |