在数据集中更快地实现洗牌桶的实现?蟒蛇

时间:2017-06-26 08:52:05

标签: python optimization

有更快的方法来实现这个吗?每行大约有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)

1 个答案:

答案 0 :(得分:1)

有些未成年人可能会尝试:

  1. 将键和值合并为单个调用:

    表示shuffle_indexes_dict.iteritems()中的键值:

  2. 使用xrange而不是范围

  3. 存储桶值似乎是整数 - 尝试缓存它们。

    _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
    
  4. 如果shuffle_indexes_dict范围是独占的,那么你可以 - 可能 - 避免从input_data中复制值。

  5. 否则我会说你运气不好。