优化数据字典的代码(python函数技巧)

时间:2018-07-30 17:41:35

标签: python numpy dictionary deep-learning pickle

我是一位非常业余的编码人员,他正在寻求优化代码以节省时间。我在下面包含了我的代码。

我意识到这是错误/无效的代码

这11个mod_files(例如OOK_IQ)非常大,每个块大约200 MB(以文本文件格式,我知道这很愚蠢),因此逐行迭代每个文件大约有4000万行。每个元素都有2个元素,并以逗号作为分隔符。因此,最终我想为每个调制文件创建一个[2, 40 M]矩阵。

示例mod_file

0.00234, -0.20123  
0.01643, -0.11200   
etc...

然后,我想通过后续的for循环细分。

import numpy as np
import pickle
import time

modulations = ['OOK', '4ASK', '8ASK', 'BPSK', 'QPSK', '8PSK', '16PSK', '32PSK', '16APSK', '32APSK', '64APSK', '128APSK', '16QAM', '32QAM', '64QAM', '128QAM', '256QAM']

mod_files = [j + '_IQ' for j in modulations]

peter_piper = {}; set_count = 0; mod_count = 0;

for modtype in modulations:
    for mod_file in mod_files:
        mod_count+=1;
        print("We are in modulation loop: ", + mod_count);        
        with open(mod_file, 'r') as f:
            data = [] 

            track = 0
            print("Splitting lines . . .")
            time1 = time.time();
            for row_num, line in enumerate(f):                
                values = line.strip().split('\n')                
                for numbers in values:        
                    inphase, quad = numbers.strip().split(',')
                    if track == 0:                    
                        data = np.asarray([[float(inphase)],[float(quad)]])                    
                    else:
                        data= np.append(data, [[float(inphase)],[float(quad)]],axis=1)                
                track += 1
            print("Track number: ", + track);         
            time2 = time.time(); print("File read time: ", + (time2-time1))        
            data.astype(np.float32)            
            subarrays = []
            print("Splitting into subarrays ...");            
            subarrays = np.array_split(data, 39000, axis=1) # 1500 examples per SNR
            array_count = 0;     
            for i in range(1500):            
                for snr in range(-20, 32, 2):
                    t1 = time.time();                    
                    which_array = []                    
                    which_array = subarrays[array_count]
                    which_array[abs(which_array) > 2] = 0;
                    peter_piper[(modtype, str(snr))] = which_array
                    array_count += 1; t2 = time.time();             
                    print("*** SNR Loop Time: ", + (t2-t1));
                #basic_data = array(data)'''
            f.close()
            print(subarrays[0], subarrays[0].shape)
            set_count+=1
            print("*****The array count is, " + set_count + "of 17 modulations")
pickle.dump(peter_piper, open("2018_IQ_dataset_v1","wb"))

我确定你们当中有些人认为这将是一个非常耗时的程序。到目前为止,仅创建17个初始矩阵中的第一个矩阵就需要一个多小时。我预计这部分需要一天的时间。

我很想在这里找到一个整体的时间解决方案。

是否以二进制或其他格式保存初始数据“ mod_files”会改善该项目?还是纯粹的数据量太大?

任何效率提示将不胜感激。

0 个答案:

没有答案