如何高效筛选Python字典中的指定键值对子集?
问题
我有一个大型字典:
{ "configGlossary:installationAt": "Philadelphia, PA", "configGlossary:adminEmail": "ksm@pobox.com", "configGlossary:poweredBy": "Cofax", "configGlossary:poweredByIcon": "/images/cofax.gif", "configGlossary:staticPath": "/content/static", "templateProcessorClass": "org.cofax.WysiwygTemplate", "templateLoaderClass": "org.cofax.FilesTemplateLoader", "templatePath": "templates", "templateOverridePath": "", "defaultListTemplate": "listTemplate.htm", "defaultFileTemplate": "articleTemplate.htm", "useJSP": false, "jspListTemplate": "listTemplate.jsp", "jspFileTemplate": "articleTemplate.jsp", "cachePackageTagsTrack": 200, "cachePackageTagsStore": 200, "cachePackageTagsRefresh": 60, "cacheTemplatesTrack": 100, "cacheTemplatesStore": 50, "cacheTemplatesRefresh": 15, "cachePagesTrack": 200, "cachePagesStore": 100, "cachePagesRefresh": 10, "cachePagesDirtyRead": 10, "searchEngineListTemplate": "forSearchEnginesList.htm", "searchEngineFileTemplate": "forSearchEngines.htm", "searchEngineRobotsDb": "WEB-INF/robots.db", "useDataStore": true, "dataStoreClass": "org.cofax.SqlDataStore", "redirectionClass": "org.cofax.SqlRedirection", "dataStoreName": "cofax", "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver", "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", "dataStoreUser": "sa", "dataStorePassword": "dataStoreTestQuery", "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", "dataStoreInitConns": 10, "dataStoreMaxConns": 100, "dataStoreConnUsageLimit": 100, "dataStoreLogLevel": "debug", "maxUrlLength": 500 }
需要提取指定键值对,得到如下精简字典:
{ "cachePackageTagsTrack": 200, "cachePackageTagsStore": 200, "cachePackageTagsRefresh": 60, "cacheTemplatesTrack": 100, "cacheTemplatesStore": 50, "cacheTemplatesRefresh": 15, "cachePagesTrack": 200, "cachePagesStore": 100, "cachePagesRefresh": 10, "cachePagesDirtyRead": 10 }
没有现成方法直接实现,且要处理大量同类循环数据,求快速高效的精简方案。
高效精简方案
1. 预存目标键集合 + 字典推导式
集合的键查找是O(1)时间复杂度,适合处理大量数据时重复使用:
# 定义要保留的键集合(集合比列表查找快) target_keys = { "cachePackageTagsTrack", "cachePackageTagsStore", "cachePackageTagsRefresh", "cacheTemplatesTrack", "cacheTemplatesStore", "cacheTemplatesRefresh", "cachePagesTrack", "cachePagesStore", "cachePagesRefresh", "cachePagesDirtyRead" } # 原始大字典 original_dict = { # 你的大字典内容 } # 生成精简字典 trimmed_dict = {k: v for k, v in original_dict.items() if k in target_keys}
如果批量处理多个大字典,把target_keys定义在循环外,避免重复创建,能进一步提升效率。
2. 生成器表达式配合dict()构造
和字典推导式效率接近,写法略有不同:
trimmed_dict = dict((k, original_dict[k]) for k in target_keys if k in original_dict)
适合提前确定目标键大概率存在的场景,if k in original_dict可避免KeyError。
3. 直接按键提取(键固定场景)
如果目标键固定且无需动态调整,直接提取速度最快:
trimmed_dict = { "cachePackageTagsTrack": original_dict["cachePackageTagsTrack"], "cachePackageTagsStore": original_dict["cachePackageTagsStore"], "cachePackageTagsRefresh": original_dict["cachePackageTagsRefresh"], "cacheTemplatesTrack": original_dict["cacheTemplatesTrack"], "cacheTemplatesStore": original_dict["cacheTemplatesStore"], "cacheTemplatesRefresh": original_dict["cacheTemplatesRefresh"], "cachePagesTrack": original_dict["cachePagesTrack"], "cachePagesStore": original_dict["cachePagesStore"], "cachePagesRefresh": original_dict["cachePagesRefresh"], "cachePagesDirtyRead": original_dict["cachePagesDirtyRead"] }
性能优化要点
- 用集合存目标键:集合
in操作是O(1),列表是O(n),大量数据下差距明显。 - 复用目标键集合:批量处理时,避免在循环内重复创建
target_keys。 - 优先用字典推导式:Python中字典推导式的执行效率高于普通循环+
dict.update()。
内容的提问来源于stack exchange,提问作者Arun Infovibez
相关产品推荐
相关产品推荐

