有更快的方法来实现这个吗?每行大约有1024个桶,它没有我希望的那么快..
我想产生很多,但它需要几个小时才能完成。这是相当的瓶颈..任何有关如何优化它的建议或想法将不胜感激!
编辑* 抱歉没有最低限度的工作实例。现在发布了。如果可以为Python 2.7进行优化,那将非常感激。
import math
import numpy as np
import copy
import random
def number_to_move(n):
l=math.exp(-n)
k=0
p=1.0
while p>l:
k += 1
p *= random.random()
return k-n
def createShuffledDataset(input_data, shuffle_indexes_dict, shuffle_quantity):
shuffled = []
for key in shuffle_indexes_dict:
for values in shuffle_indexes_dict[key]:
temp_holder = copy.copy(input_data[values[0] - 40: values[1]]) #may need to increase 100 padding
for line in temp_holder:
buckets = range(1,1022)
for bucket in buckets:
bucket_value = line[bucket]
proposed_number = number_to_move(bucket_value)
moving_amount = abs(proposed_number) if bucket_value - abs(proposed_number) >= 0 else bucket_value
line[bucket] -= moving_amount
if proposed_number > 0:
line[bucket + 1] += moving_amount
else:
line[bucket - 1] += moving_amount
shuffled.extend(temp_holder)
return np.array(shuffled)
example_data = np.ones((100,1024))
shuffle_indexes = {"Ranges to Shuffle 1" : [[10,50], [53, 72]]}
shuffle_quantity = 1150
shuffled_data = createShuffledDataset(example_data, shuffle_indexes,
shuffle_quantity)
答案 0 :(得分:1)
有些未成年人可能会尝试:
将键和值合并为单个调用:
表示shuffle_indexes_dict.iteritems()中的键值:
使用xrange而不是范围
存储桶值似乎是整数 - 尝试缓存它们。
_cache = {}
def number_to_move(n):
v = _cache.get(n, None)
if v is not None: return v
l=math.exp(-n)
k=0
p=1.0
while p>l:
k += 1
p *= random.random()
v = k-n
_cache[n] = v
return v
如果shuffle_indexes_dict范围是独占的,那么你可以 - 可能 - 避免从input_data中复制值。
否则我会说你运气不好。