【发布时间】:2015-08-25 09:03:16
【问题描述】:
我已经开始在很多事情上使用 NumPy 而不是 MATLAB,而且对于大多数事情来说,它似乎要快得多。我刚刚尝试在 Python 中复制代码,但速度要慢得多。我想知道是否有知道两者的人可以看看它,看看为什么会这样
NumPy:
longTicker = np.empty([1,len(ticker)],dtype='U15')
genericTicker = np.empty([len(ticker)],dtype='U15')
tickerType = np.empty([len(ticker)],dtype='U10')
tickerList = np.vstack((np.empty([2,len(ticker)],dtype='U30'),np.ones([len(ticker)],dtype='U30')))
tickerListnum = 0
modelList = np.empty([2,9999],dtype='U2')
modelListnum = 0
derivativeType = np.ones(len(ticker))
for l in range(0,len(ticker)):
tickerType[l] = 'Future'
if not modCode[l] in list(modelList[1,:]):
modelList[0,modelListnum] = modelListnum + 1
modelList[1,modelListnum] = modCode[l]
modelListnum += 1
if ticker.item(l).find('3 MONTH') >= 0:
x = list(metalTicks[:,0]).index(ticker[l])
longTicker[0,l] = metalTicks[x,3]
if not longTicker[0,l] in list(tickerList[1,:]):
tickerList[0,tickerListnum] = tickerListnum + 1
tickerList[1,tickerListnum] = longTicker[0,l]
tickerList[2,tickerListnum] = 4
tickerListnum += 1
derivativeType[l] = 4
tickerType[l] = 'Future'
if ticker.item(l).find('CURNCY') >= 0:
if ticker.item(l).find('KRWUSD CURNCY'):
prices[l] = 1/float(prices.item(l))
longTicker[0,l] = ticker[l,0]
if not longTicker[0,l] in list(tickerList[1,:]):
tickerList[0,tickerListnum] = tickerListnum + 1
tickerList[1,tickerListnum] = longTicker[0,l]
tickerList[2,tickerListnum] = 2
tickerListnum += 1
derivativeType[l] = 2
tickerType[l] = 'FX'
if ticker.item(l).find('_') >= 0:
x = ticker[l] == sasTick
longTicker[0,l] = bbgTick[x]
if not longTicker[0,l] in list(tickerList[1,:]):
tickerList[0,tickerListnum] = tickerListnum + 1
tickerList[1,tickerListnum] = longTicker[0,l]
tickerList[2,tickerListnum] = 3
tickerListnum += 1
derivativeType[l] = 3
tickerType[l] = 'Option'
# need convert ticker thing
if not longTicker[0,l] in list(tickerList[1,:]):
tickerList[0,tickerListnum] = tickerListnum + 1
tickerList[1,tickerListnum] = longTicker[0,l]
tickerList[2,tickerListnum] = 1
tickerListnum += 1
MATLAB 代码:
longTicker = cell(size(ticker));
genericTicker = cell(size(ticker));
type = repmat({'Future'},size(ticker));
tickerList = repmat([cell(1);cell(1);{1}],1,9999);
%tickerList = cell(3,9999);
tickerListnum = 0;
modelList = cell(2,9999);
modelListnum = 0;
derivativeType = ones(size(ticker));
for j=1:length(ticker)
if isempty(find(strcmp(modCode{j},modelList(2,:)), 1))
modelListnum = modelListnum+1;
modelList{1,modelListnum}= modelListnum;
modelList(2,modelListnum)= modCode(j);
end
if ~isempty(strfind(ticker{j},'3 MONTH'))
x =strcmp(ticker{j},metalTicks(:,1));
longTicker{j} = metalTicks{x,4};
% genericTicker{j} = metalTicks{x,4};
if isempty(find(strcmp(longTicker(j),tickerList(2,:)), 1))
tickerListnum = tickerListnum+1;
tickerList{1,tickerListnum}= tickerListnum;
tickerList(2,tickerListnum)=longTicker(j);
tickerList{3,tickerListnum}=4;
end
derivativeType(j) = 4;
type{j} = 'Future';
continue;
end
if ~isempty(regexp(ticker{j},'[A-Z]{6}\sCURNCY', 'once'))
if strcmpi('KRWUSD CURNCY',ticker{j})
prices{j}=1/prices{j};
end
longTicker{j} = ticker{j};
% genericTicker{j} = ticker{j};
if isempty(find(strcmp(longTicker(j),tickerList(2,:)), 1))
tickerListnum = tickerListnum+1;
tickerList{1,tickerListnum}= tickerListnum;
tickerList(2,tickerListnum)=longTicker(j);
tickerList{3,tickerListnum}=2;
end
derivativeType(j) = 2;
type{j} = 'FX';
continue;
end
if ~isempty(regexp(ticker{j},'_', 'once'))
z = strcmp(ticker{j},sasTick);
try
longTicker(j) = bbgTick(z);
catch
keyboard; % I did this - Dave
end
% genericTicker(j) = bbgTick(z);
if isempty(find(strcmp(longTicker(j),tickerList(2,:)), 1))
tickerListnum = tickerListnum+1;
tickerList{1,tickerListnum}= tickerListnum;
tickerList(2,tickerListnum)=longTicker(j);
tickerList{3,tickerListnum}=3;
end
derivativeType(j) = 3;
type{j} = 'Option';
continue;
end
try
longTicker{j} = ConvertTicker(ticker{j},'short','long',tradeDate(j));
% genericTicker{j} = ConvertTicker(ticker{j},'short','generic',tradeDate(j));
catch
longTicker{j} = ticker{j};
% genericTicker{j} = ticker{j};
end
if isempty(find(strcmp(longTicker(j),tickerList(2,:)), 1))
tickerListnum = tickerListnum+1;
tickerList{1,tickerListnum}= tickerListnum;
tickerList(2,tickerListnum)=longTicker(j);
tickerList{3,tickerListnum}=1;
end
end
在这种情况下,MATLAB 似乎快了大约 100 倍。 Python 中的循环是否慢得多?
【问题讨论】:
-
很难说是什么原因造成的。尝试使用
python -m cProfile script.py和 MATLAB 脚本分析您的 python 脚本(我知道 matlab 中有一个分析器,但我不知道如何使用它)。 -
您能解释一下代码的哪些部分运行速度较慢吗?只需在关键部分插入时间。最重要的比较是两个代码中的一个循环持续时间。并且也许对代码将要做什么给出一个整体的解释。关于 for 循环:它们在 python 中往往很慢,但是当使用 cython 时,您可以大大加快 for 循环以及 numpy 的 c 兼容性。
-
这段代码摘自一段更大的代码。这是似乎运行非常缓慢的部分,通常是较大的 for 循环。每次迭代在 MATLAB 中的运行速度比在 NumPy 中快约 100 倍。一个循环的持续时间在 MATLAB 中需要 0.05 秒,在 Python 中大约需要 4 秒
-
@Lererferler 缩小范围:在摘录的开头、中间和结尾添加计时。有一次,你发现哪一半消耗了大部分时间,通过在那里添加时间来处理它。由于这是一个较大脚本的摘录,我们都无法为您运行和配置文件。
-
一个候选者是从 Numpy 数组到 Python 列表的重复转换。尝试通过使用其中一个或另一个来避免这种情况。如果这不是一个选项,使用
ndarray.tolist方法应该会更快。