学Python途中可能会遗漏的一些关键点

Python数据结构性能优化
本文对比了Python中字典和列表在数据查找上的性能差异,字典使用hashtable实现,查找复杂度为O(1),而列表查找复杂度为O(n)。通过实验证明,对于大量数据的频繁查找,使用字典可以显著提高效率。同时,文章还介绍了如何通过减少循环计算量来优化循环,以及ASCII码的转换方法。

Python 字典中使用了 hash table,因此查找操作的复杂度为 O(1),而 list 实际是个数组,在 list 中,查找需要遍历整个 list,其复杂度为 O(n),因此对成员的查找访问等操作字典要比 list 更快。

import time

arr = ['apple', 'samsung', 'huawei', 'python', 'java', 'c', 'C++', 'C#', 'php', 'ruby',\
 'go','asp', 'html', 'huashuo', 'lianxiang', 'deer', 'jpg', 'pdf', 'txt', 'png', 'exe']
 
# arr = dict.fromkeys(arr, True)

t = time.time()      # 程序开始的时间
filet = []
for i in range(1000000):
    for i in ['apple', 'pdf', 'lianxiang', 'java', 'samsung']:
        if i in arr:           # 没有去掉前一句注释的时候,这里的arr使用的是列表那个结构,如果去掉注释,那么它是转换为字典类型使用的
            filet.append(i)
end = time.time() - t  	# 程序结束的时间

filet = set(filet)
print(end)
print(filet)

上述代码运行大概需要 5.7s左右的时间。如果去掉行 # arr = dict.fromkeys(arr, True)的注释,将 list 转换为字典之后再运行,时间大约为 3.7s,效率提高了一小半。因此在需要多数据成员进行频繁的查找或者访问的时候,使用 dict 而不是 list 是一个较好的选择。

set 常见用法

语法	                       操作	            	 说明
set(list1) | set(list2)	   union			包含 list1 和 list2 所有数据的新集合
set(list1) & set(list2)	   intersection			包含 list1 和 list2 中共同元素的新集合
set(list1) - set(list2)	   difference			在 list1 中出现但不在 list2 中出现的元素的集合

对循环的优化
对循环的优化所遵循的原则是尽量减少循环过程中的计算量,有多重循环的尽量将内层的计算提到上一层。 下面通过实例来对比循环优化后所带来的性能的提高。如果不进行循环优化,其大概的运行时间约为 132.375。

循环优化前

from time import time 
t = time() 
lista = [1,2,3,4,5,6,7,8,9,10] 
listb =[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.01] 
for i in range (1000000): 
    for a in range(len(lista)): 
        for b in range(len(listb)): 
            x=lista[a]+listb[b] 
print("total run time:")
print(time()-t)

现在进行如下优化,将长度计算提到循环外,将第三层的计算 lista[a] 提到循环的第二层。

循环优化后

from time import time 
t = time() 
lista = [1,2,3,4,5,6,7,8,9,10] 
listb =[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.01] 
len1=len(lista) 
len2=len(listb) 
for i in range (1000000): 
    for a in range(len1): 
        temp=lista[a] 
        for b in range(len2): 
            x=temp+listb[b] 
print(time()-t)

上述优化后的程序其运行时间缩短为 102.171999931。优化前的 lista[a] 被计算的次数为 10000001010,而在优化后的代码中被计算的次数为1000000*10,计算次数大幅度缩短,因此性能有所提升。

ASCII码转换
ord('a')			//97,用于ASCII码将字符型转为数字型
chr(97)			//a,  用于ASCII码将数字型转为字符型
import random import argparse import numpy as np import matplotlib.pyplot as plt from math import radians, cos, sin, asin, sqrt def earth_distance(lon1, lat1, lon2, lat2): """计算地球表面两点间距离(公里)""" lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2 return 6371 * 2 * asin(sqrt(a)) def city_distance(cities): """生成城市距离矩阵""" N = len(cities) matrix = np.zeros((N, N)) for i in range(N): for j in range(i, N): dist = earth_distance(*cities[i], *cities[j]) matrix[i][j] = matrix[j][i] = round(dist, 2) return matrix def calc_path_distance(matrix, path): """计算路径总距离""" return sum(matrix[path[i]][path[i + 1]] for i in range(len(path) - 1)) def read_from_coords_txt(lines): """从文本行解析坐标数据""" return [list(map(float, line.strip().split())) for line in lines] def read_data_files(use_test=False): """加载数据集""" all_coords = [] for i in range(3): # 默认3个数据集 filename = f'data/test_{i}.txt' if use_test else f'data/val_{i}.txt' with open(filename, 'r') as f: all_coords.append(read_from_coords_txt(f.readlines())) return all_coords def plotTSP(path, points): """可视化TSP路径""" x = [points[i] for i in path] y = [points[i][1] for i in path] plt.figure(figsize=(10, 6)) plt.plot(x, y, 'co') # 绘制城市点 # 绘制路径箭头 a_scale = max(x) / 100 for i in range(len(path) - 1): dx = x[i + 1] - x[i] dy = y[i + 1] - y[i] plt.arrow(x[i], y[i], dx, dy, head_width=a_scale, color='g', length_includes_head=True) plt.title(f"TSP Solution (Path length: {calc_path_distance(city_distance(points), path):.2f} km)") plt.show() def ant_colony_tsp(coords, iterations=100, ants=20, alpha=1, beta=5, rho=0.5): """蚁群优化算法实现""" num_nodes = len(coords) dist_matrix = city_distance(coords) pheromone = np.ones((num_nodes, num_nodes)) best_path = None best_length = float('inf') for _ in range(iterations): paths = [] lengths = [] for _ in range(ants): path = visited = set() while len(path) < num_nodes: current = path[-1] probs = [] for node in range(num_nodes): if node not in visited: phe = pheromone[current][node] ** alpha heuristic = (1 / dist_matrix[current][node]) ** beta probs.append((node, phe * heuristic)) total = sum(p[1] for p in probs) probs = [(p, p[1] / total) for p in probs] chosen = random.choices(probs, weights=[p[1] for p in probs]) path.append(chosen) visited.add(chosen) path.append(0) # 返回起点 length = calc_path_distance(dist_matrix, path) paths.append(path) lengths.append(length) if length < best_length: best_path, best_length = path, length # 更新信息素 pheromone *= (1 - rho) for path, length in zip(paths, lengths): for i in range(len(path) - 1): pheromone[path[i]][path[i + 1]] += 1 / length return best_path def main(): parser = argparse.ArgumentParser(description='TSP Solver') parser.add_argument('--test', action='store_true', help='Run in test mode') parser.add_argument('--visualize', action='store_true', help='Show solution visualization') args = parser.parse_args() if args.test: # 测试模式 all_coords = read_data_files(use_test=True) with open('result.txt', 'r') as f: paths = [list(map(int, line.strip().split())) for line in f] for i, (coords, path) in enumerate(zip(all_coords, paths)): assert path == path[-1] == 0, "Invalid path" assert len(path) == len(coords) + 1, "Path length mismatch" distance = calc_path_distance(city_distance(coords), path) print(f'Dataset {i} path length: {distance:.2f} km') if args.visualize: plotTSP(path, coords) else: # 求解模式 all_coords = read_data_files() results = [] for i, coords in enumerate(all_coords): path = ant_colony_tsp(coords) results.append(" ".join(map(str, path))) print(f'Dataset {i} solution: {path}') if args.visualize: plotTSP(path, coords) with open('result.txt', 'w') as f: f.write("\n".join(results)) if __name__ == "__main__": main() 如何用 Python 实现基于蚁群优化算法的旅行商问题,考虑物流节点转运时间和路程时间限制并在三天内完成配送
05-13
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数优化器加速函数(MOA)和数优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值