按比例獲取樣本數據或執行任務python
By:授客 QQ:1033553122app
開發環境spa
win 10blog
python 3.6.5索引
需求utf-8
已知每種分類的樣本佔比數,及樣本總數,須要按比例獲取這些分類的樣本。好比,我有4種任務要執行,分別爲任務A,任務B,任務C,任務D, 要求執行的總任務次數爲100000,且不一樣分類任務執行次數佔比爲 A:B:C:D = 3:5:7:9,且在宏觀上這些任務同時進行開發
代碼實現it
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' import time from copy import deepcopy def main(): class_propotion_map = {'A':3, 'B':5, 'C':7, 'D':7} # 分類及樣本數比例映射 class_list = [] # 分類 class_proption_list = [] # 存放分類樣本數比例 for class_type, propotion in class_propotion_map.items(): # 同一個循環,能夠保證比例索引和對應分類索引一一對應 class_list.append(class_type) class_proption_list.append(propotion) temp_class_propotion_list = deepcopy(class_proption_list) result = [] t1 = time.time() total_sample_num = 100000 #任務執行次數 for i in range(1, total_sample_num+1): max_propotion = max(temp_class_propotion_list) if max_propotion > 0: index = temp_class_propotion_list.index(max_propotion) result.append(class_list[index]) temp_class_propotion_list[index] -= 1 elif max_propotion == 0 and min(temp_class_propotion_list) == 0: temp_class_propotion_list = deepcopy(class_proption_list) index = temp_class_propotion_list.index(max(temp_class_propotion_list)) result.append(class_list[index]) temp_class_propotion_list[index] -= 1 t2 = time.time() from collections import Counter c = Counter(result) for item in c.items(): print(item[0], item[1]/total_sample_num) print('耗時:%s'%(t2-t1)) main()
運行結果io
說明class
以上方式大體實現思路就是,獲取每種分類樣本數所佔比例副本數據列表,而後每次從中獲取最大比例值,並查找該比例值對應的分類(獲取分類後就能夠根據須要構造、獲取分類樣本數據),找到目標分類後,把比例數據副本中該比例值減1,直到最大比例和最小比例都等於0,接着重置比例副本數據爲樣本數比例值,重複前面的過程,直到樣本數達到目標樣本總數,這種方式實現的前提是得提早知道樣本總數及不一樣分類樣本數所佔比例,且比例值爲整數