cpu24核心笔记本电脑2个内存条16g 3200m x2,用1核运行速度是50+每秒it。用10个应该是500+。但是只有170+,我尝试从1核到10核测试,发现到3核后就不是成倍增加了,后面增加核心速度变快的很少。是不是内存速度瓶颈。
with Pool(processes=workers) as pool: #
# 使用并行批量获得<class 'list'>
results = pool.imap_unordered(
# 先测试单个核心一秒多少个,用于设置chunksize参数
partial(calculate_by_one_loop, duo_lock=duo_lock), para_list, chunksize=50)
# 显示进度条
for i, result in tqdm(enumerate(results),
total=total, desc='总任务进度', mininterval=1, maxinterval=1):
df_list.append(result)
其中calculate_by_one_loop是目标函数,里面就执行np数组的计算
x = talib.SMA(close, timeperiod=10)
@jit('float64[:,:](float64[:], float64[:], float64[:], float64[:])')
def numpy_chaoji_qushi(atr, close, high, low):
"""
超级趋势计算
:param atr: 真实波动幅度
:param close: 收盘
:param high: 最高
:param low: 最低
:return: 超级趋势
"""
src = np.full_like(close, np.nan, dtype='float64') # 生成空白的数组,结构和close一样
up = np.full_like(close, np.nan, dtype='float64') # 生成空白的数组,结构和close一样
dn = np.full_like(close, np.nan, dtype='float64') # 生成空白的数组,结构和close一样
for i in range(close.shape[0]):
# 价格源hlc3
src[i] = (close[i] + high[i] + low[i]) / 3
# 计算超级趋势指标的上涨趋势线
up[i] = src[i] - atr[i]
# 过去的收盘价 大于 up[1]
if close[i - 1] > up[i - 1]:
# up就等于 up 与up1 中最大的
up[i] = max(up[i], up[i - 1])
else: # 不是就返回up自己
up[i] = up[i]
# 计算超级趋势指标的下跌趋势线
dn[i] = src[i] + atr[i]
# 过去的收盘价 大于 up[1]
if close[i - 1] < dn[i - 1]:
# up就等于 up 与up1 中最大的
dn[i] = min(dn[i], dn[i - 1])
else: # 不是就返回up自己
dn[i] = dn[i]
return np.vstack((up, dn))
很多这种使用talib的代码,基本用5列数组会生成几十上百列。再循环判断逻辑。我测试过单次计算50多ms
之前我是使用pandas的df
例如:df['x'] = talib.SMA(df['close'], timeperiod=10)
后面改成np数组,没使用一点df。速度提升了一点点。我重新写了一个只计算数学问题的程序,速度是随着进程数成倍增加的。我20核全开速度就比1核快将近20倍。所以我怀疑内存速度,但是我不知道怎么优化,已经从df数据改成np数组了。每计算一个金融指标(均线这些)就有一个单独的变量存起来。我看别人用服务器cpu和主板和内存,开几十上百个线程,速度飞快
帮我优化一下