import numpy import pandas as pd def read_asc(filepath): asc_file = pd.read_csv(filepath, skiprows=4, encoding="gbk", engine='python', sep=' ', delimiter=None, index_col=False, header=None, skipinitialspace=True) file = numpy.array(asc_file) data = read_message(file) filter_step_size(data) def read_message(file): data = [] for item in file: sh = item[4] if "107" == sh: data.append(item) data = numpy.array(data) return data def filter_step_size(data): success_sum = 0 fail_sum = 0 result = [] for i in range(len(data) - 1): diff = data[:, 0][i + 1] - data[:, 0][i] if 0.090 < diff < 0.110: success_sum += 1 else: fail_sum += 1 result.append((data[:, 0][i], data[:, 0][i + 1], diff)) print("步长通过数{}".format(success_sum)) print("步长未通过数{}".format(fail_sum)) print("未通过前一项值:未通过后一项值:差值:") print(numpy.array(result)) if __name__ == '__main__': read_asc("E:\package\databin 7-11-2023 9-12-31 am Messages File.asc") 优化这段代码,使执行效率变高
时间: 2024-04-10 09:34:00 浏览: 99
解决pandas使用read_csv()读取文件遇到的问题
为了优化这段代码的执行效率,可以考虑以下几点:
1. 减少不必要的循环:在 `filter_step_size` 函数中,可以使用向量化操作来计算差值,并使用 NumPy 的布尔索引来筛选满足条件的数据。这样可以避免使用循环和判断语句,提高执行效率。
2. 使用适当的数据结构:在 `filter_step_size` 函数中,使用了一个列表 `result` 来存储不满足条件的数据。但是,在每次迭代中,通过 `result.append` 的方式向列表中添加元素,这会导致每次添加都需要重新分配内存,效率较低。可以考虑使用 NumPy 的数组来存储结果,并预先分配足够的空间。
下面是优化后的代码:
```python
import numpy as np
import pandas as pd
def read_asc(filepath):
asc_file = pd.read_csv(filepath, skiprows=4, encoding="gbk", engine='python', sep=' ', delimiter=None,
index_col=False, header=None, skipinitialspace=True)
file = np.array(asc_file)
data = read_message(file)
filter_step_size(data)
def read_message(file):
mask = file[:, 4] == "107"
data = file[mask]
return data
def filter_step_size(data):
diff = np.diff(data[:, 0])
mask = np.logical_and(0.090 < diff, diff < 0.110)
success_sum = np.count_nonzero(mask)
fail_sum = len(mask) - success_sum
result = np.column_stack((data[:-1, 0], data[1:, 0], diff))
result = result[~mask]
print("步长通过数: {}".format(success_sum))
print("步长未通过数: {}".format(fail_sum))
print("未通过前一项值:未通过后一项值:差值:")
print(result)
if __name__ == '__main__':
read_asc("E:\package\databin 7-11-2023 9-12-31 am Messages File.asc")
```
这样优化后的代码将会更高效地执行。注意,这里使用了 NumPy 的函数和操作来进行向量化计算和逻辑运算,以提高执行效率。
阅读全文