我已经开始使用NumPy而不是MATLAB来处理很多事情,而且对于大多数事情来说,它似乎要快得多。我刚刚尝试用Python复制一段代码,但是速度要慢得多。我想知道两个都懂的人能不能看看,看看为什么会这样
纽比:
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代码:
^{pr2}$在这个例子中,MATLAB似乎快了大约100倍。Python中的循环慢得多吗?在
虽然我不能确定是什么是导致减速的主要原因,但我确实注意到了一些会导致减速、易于修复并会导致代码更干净的事情:
sastick
,bbgtick
,和{append
;对于需要使用None
或空字符串''
访问任意元素预分配的情况。对于tickerList
来说,有两个列表可能更容易。在foo.item(l)
。这会将numpy元素转换为普通的python数据类型。同样,这是一个类型转换,所以如果可以避免的话,不要这样做。如果您遵循我的建议1
并使用列表,那么在当前代码中就不需要这样做了。在continue
语句,但在python版本中没有,这意味着您在python版本中执行计算,而在MATLAB版本中则跳过。我认为使用if..elseif
更好,但是{range(0,len(ticker))
,然后多次提取ticker元素。您最好直接在ticker
上循环,例如for i, iticker in enumerate(ticker):
。使用enumerate
还可以跟踪索引。在find
来确定子字符串是否在给定字符串中。使用in
可以更快、更清晰、更简单。仅当您关心子字符串在哪里找到时才使用find
,而您并不关心tickerType
预先分配给'Future'会更快,就像您在MATLAB中所做的那样,这可以通过使用tickerType = ['Future']*len(ticker)
这样的方法来实现。在tickerListnum
和{tickerList
的第一行中每个值只有一个实例,所以使用OrderedDict
,或者使用常规的dict
,如果不关心顺序,其中的键是longTicker
值,而值是类型号,则会更快更容易使用。在modelList
的顺序,那么使用set
会更快。在所以这里有一个更快的版本,假设}是列表或数组,假设您关心}的顺序:
metalTicks
,tickerList
是列表列表,sasTick
是numpy数组,prices
和{modelList
和{如果您不关心
^{pr2}$modelList
和tickerList
的顺序,可以这样做:或者更简单:
相关问题 更多 >
编程相关推荐