我是一位非常业余的编码人员,他正在寻求优化代码以节省时间。我在下面包含了我的代码。
我意识到这是错误/无效的代码
这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
”会改善该项目?还是纯粹的数据量太大?
任何效率提示将不胜感激。