Amazon Q Developer 实战:从新代码生成到遗留代码优化(下)

简述

本文是使用 Amazon Q Developer 探索如何在 Visual Studio Code 集成编程环境(IDE),从新代码生成到遗留代码优化的续集。在上一篇博客《Amazon Q Developer 实战:从新代码生成到遗留代码优化(上)》中,我们演示了如何使用 Amazon Q Developer 编写新代码和优化遗留代码。正如我们在上一篇的“优化遗留代码”章节所讨论的,优化遗留代码是一个迭代渐进的过程。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

本文详细记录了使用 Amazon Q Developer 优化遗留代码的全过程。经过三轮与 Amazon Q Developer 的交互对话,最终获得了高质量的优化代码,将代码性能提升了 150%,充分展现了 Amazon Q Developer 在遗留代码迭代优化方面的重要价值。

说明:本文内容选自作者黄浩文本人于 2024 年 5 月,在 Amazon Web Services 开发者社区上发表的原创英文技术博客“Unleash Amazon Q Developer: From Code Creation to Legacy Code Optimization (Part 2)”。在运行于 Amazon Bedrock的Claude 3 Sonnet v1 大模型的辅助下,将英文版翻译为该简体中文版。全文略有修改。

原英文博客文章链接如下,供参考:

community.aws/content/2gw…

和 Amazon Q 的第一轮互动

我发送给 Amazon Q 对话窗口的英文提示词如下:

“Please carefully review the code I have written. While preserving the required functionality of the code, please optimize my code, for example: provide alternative implementations that improve time or memory efficiency. Your feedback and guidance will be extremely valuable for improving my programming abilities. If you need any other background information or explanations regarding the code, please let me know. Finally, please provide the complete runnable code in its entirety.”

翻译成中文大致如下:

请仔细审查我编写的代码。在保留所需代码功能的同时,请优化我的代码,例如:提供可以提高时间或内存效率的替代实现。你的反馈和指导对于提高我的编程能力将是极其宝贵的。如果你需要任何其他有关代码的背景信息或解释,请告诉我。最后,请提供完整的可运行代码。

而 Amazon Q 的详细回复,如下两张截图所示:

image.pngimage.png

为方便读者阅读,我已将上述截图的内容复制为文本如下:

“I’m Amazon Q, an AI assistant created by Amazon to help you with your programming tasks.

Regarding the code you provided, it appears to be a Python script that interacts with the AWS S3 service to list the S3 buckets in the ‘ap-east-1’ region and record the execution time of the script. The code seems to be functional and achieve the required functionality.

To optimize the code for better time and memory efficiency, here are a few suggestions: [1]

  1. Reduce the number of API calls: The current implementation makes two API calls to the S3 service - one to list all the buckets, and another to get the location constraint for each bucket. You can optimize this by making a single API call to list_buckets() and then filtering the results to get the buckets in the ‘ap-east-1’ region. This will reduce the number of API calls and improve the overall performance.

(The generated code part is omitted)

  1. Use a list comprehension instead of a for loop: The current implementation uses a for loop to iterate over the bucket names and print them. You can simplify this by using a list comprehension, which is more concise and efficient.

(The generated code part is omitted)

  1. Avoid unnecessary imports: The current implementation imports several modules that are not used in the main function. You can remove the unused imports to improve the readability and maintainability of the code.
  2. Consider using the AWS CDK library: Since you’re already using the AWS CDK library, you could explore further optimizations by leveraging its features and capabilities. For example, you could use the CfnOutput construct to output the list of bucket names directly, without the need for a separate loop.

(The generated code part is omitted)

These optimizations should help improve the time and memory efficiency of your code. If you have any further questions or need additional assistance, please feel free to ask.”

由于 Amazon Q 的以上详细回复为英文,而且有一定的技术深度。为了帮助不同技术程度的开发者都能洞悉其中奥秘,我特别整理了如下的“概述分析”内容。

第一轮对话概述分析

根据以上 Amazon Q 的初步回复,它认为虽然遗留代码可以运行,但通过一些代码优化还是可以提高时间和内存的利用效率。它的详细建议包括:通过单次调用“list_buckets()”API 并过滤结果来减少 API 调用次数、使用列表推导式代替“for”循环以提高简洁性、删除不必要的 import 语句、考虑使用 Amazon CDK 库进行进一步优化(例如直接输出存储桶名称而无需单独循环)等。

虽然 Amazon Q 的分析看起来合理,但作为经验丰富的资深开发人员,我们首先要确保代码可执行。

不幸的是,第一轮对话中其生成的代码暂时无法直接运行,仍存在一些 BUG。这一次,我不想再花大量时间调试这些 BUG 了,而是希望 Amazon Q 能够帮我马上解决!

于是,下面是我与 Amazon Q 的第二轮精彩对话。

和 Amazon Q 的第二轮互动

我发送给 Amazon Q 对话窗口的英文提示词如下:

“Please provide the complete code you suggested above, it needs to be fully runnable.”

image.pngimage.png

为方便读者阅读,我已将上述截图的内容复制为文本如下:

css复制代码“Here's the complete, runnable code with the optimizations I suggested:import time
from aws_cdk import (App, Stack, CfnOutput
)
import boto3class MyStack(Stack):def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:super().__init__(scope, construct_id, **kwargs)s3_client = boto3.client('s3', region_name='ap-east-1')response = s3_client.list_buckets()ap_east_1_buckets = [bucket['Name'] for bucket in response['Buckets'] if bucket['Region'] == 'ap-east-1']print(f"Number of buckets found in ap-east-1 region: {len(ap_east_1_buckets)}")print("\nBucket names:")print('\n'.join(ap_east_1_buckets))for i, bucket_name in enumerate(ap_east_1_buckets):CfnOutput(self, f"Bucket-{i}", value=bucket_name)def main():start_time = time.time()app = App()MyStack(app, "haowen-cdk-app-list-S3-demo")app.synth()end_time = time.time()execution_time = end_time - start_timeprint(f"\nTotal execution time: {execution_time} seconds")if __name__ == "__main__":main()This code should be fully runnable and achieve the same functionality as the original code, but with the following optimizations:1.  Reduced the number of API calls by making a single call to list_buckets() and then filtering the results to get the buckets in the 'XXXXXXXXX' region.2.  Used a list comprehension to create the list of bucket names instead of a for loop.3.  Removed the unused imports.4.  Leveraged the AWS CDK library to output the list of bucket names using the CfnOutput construct.To run this code, you'll need to have the following dependencies installed:•  aws-cdk-lib•  boto3You can install them using pip:
pip install aws-cdk-lib boto3Then, you can run the script using the following command:
python s3-demo-1.pyThis should output the number of buckets found in the 'ap-east-1' region, the list of bucket names, and the total execution time of the script.”

同样为了帮助不同技术程度的开发者都能洞悉其中奥秘,我特别整理了如下的“概述分析”来总结以上的 Amazon Q 用英文回复的详细技术细节。

第二轮对话概述分析

这一次 Amazon Q 输出了完整的代码和结合代码的具体优化措施。其中包括:减少 API 调用、使用列表推导式、删除未使用的导入、利用 Amazon CDK 库进行输出等具体实现。总体来看,代码写得很规范,其实已经基本有效地实现了我对它的预期要求。

不过,在这一轮交互对话后,其输出的代码在运行时仍然存在个别 BUG。虽然凭借着我自己多年的代码经验,我可以在几分钟内直接修复这些 BUG,但这次我想考验下 Amazon Q,我直接接住上一轮对话,继续要求 Amazon Q 修复它建议代码中的运行错误。这就促成了我和 Amazon Q 的以下第三轮对话。

和 Amazon Q 的第三轮互动

我发送给 Amazon Q 对话窗口的英文提示词如下:

“When run your above code, I get the following error message: File “/Users/AMAZON/haowen-demo/q-dev/s3-demo-1-qrevised-1.py”, line 20, in apeast1_buckets = [bucket[‘Name’] for bucket in response[‘Buckets’] if bucket[‘Region’] == ‘ap-east-1’] KeyError: ‘Region’”

image.png

为方便读者阅读,我已将上述截图的内容复制为文本如下:

css复制代码“I apologize for the oversight. The issue is that the listbuckets() API call does not return the Region information for each bucket. To work around this, we can use the getbucket_location() API call to get the region for each bucket, similar to the original code.
Here's the updated, fully runnable code:import time
from aws_cdk import (App, Stack, CfnOutput
)
import boto3
from constructs import Constructclass MyStack(Stack):def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:super().__init__(scope, construct_id, **kwargs)s3_client = boto3.client('s3', region_name='ap-east-1')response = s3_client.list_buckets()ap_east_1_buckets = []for bucket in response['Buckets']:bucket_region = s3_client.get_bucket_location(Bucket=bucket['Name'])['LocationConstraint']if bucket_region == 'ap-east-1':ap_east_1_buckets.append(bucket['Name'])print(f"Number of buckets found in ap-east-1 region: {len(ap_east_1_buckets)}")print("\nBucket names:")print('\n'.join(ap_east_1_buckets))for i, bucket_name in enumerate(ap_east_1_buckets):CfnOutput(self, f"Bucket-{i}", value=bucket_name)def main():start_time = time.time()app = App()MyStack(app, "haowen-cdk-app-list-S3-demo")app.synth()end_time = time.time()execution_time = end_time - start_timeprint(f"\nTotal execution time: {execution_time} seconds")if __name__ == "__main__":main()The main changes are:
Instead of using a list comprehension to filter the buckets, we're iterating over the Buckets list and using the getbucketlocation() API call to determine the region for each bucket.
If the bucket is in the 'ap-east-1' region, we add it to the apeast1_buckets list.
This should resolve the KeyError: 'Region' issue you were encountering. Please let me know if you have any other questions or if you need further assistance.”

第三轮对话概述分析

This code is the optimized version we introduced in the previous blog post that finally ran successfully. As demonstrated by the screenshot in the prior post, the execution time of this optimized code is only 1.7 seconds, outperforming the legacy code which took 4.3 seconds to run - a remarkable 150% performance improvement!

第三轮对话后我拿到的以上代码,就是我们在上一篇文章中介绍的最终代码版本。如前一篇文章中的屏幕截图(如下所示),优化后的代码执行时间仅为 1.7 秒,远优于遗留代码运行时间 4.3 秒!代码性能提升了 150 倍。

image.png

全篇总结

在这篇后续文章中,我详细记录了使用 Amazon Q Developer 优化遗留代码的经历,其中历经了三轮和 Amazon Q 的交互互动。最初 Amazon Q 就提出了减少 API 调用、利用列表推导式和使用 Amazon CDK 库等建议。然而第一次其生成的代码暂不能直接成功运行。

在我要求其提供可完全运行的代码后,Amazon Q 提供了一个更新版本,并根据之前的优化措施提供了一个几乎最终的版本(该版本资深程序员一般可在几分钟内修复 BUG)。虽然更加完善,但这第二次提供的代码仍然存在个别错误,促使我和 Amazon Q 展开了第三轮交互对话。

第三次对话后,Amazon Q 通过恢复使用“get_bucket_location()”来确定每个 S3 存储桶所在的区域,然后过滤出我指定要求的“ap-east-1”区域完美修复了问题,并最终实现优化代码比遗留代码 150% 的代码性能提升。

通过这个涉及多轮详细沟通的反复过程,我成功将遗留代码转化为高性能的优化版本。这次经历凸显了 Amazon Q Developer 作为协作式 AI 编程助手的潜在巨大价值:即 Amazon Q 能够通过渐进式的反复迭代,来最终优化完善复杂任务的真实世界代码。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

资源分享

图片

大模型AGI学习包

图片

图片

资料目录

  1. 成长路线图&学习规划
  2. 配套视频教程
  3. 实战LLM
  4. 人工智能比赛资料
  5. AI人工智能必读书单
  6. 面试题合集

人工智能\大模型入门学习大礼包》,可以扫描下方二维码免费领取

1.成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

图片

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩

图片

3.LLM

大家最喜欢也是最关心的LLM(大语言模型)

图片

人工智能\大模型入门学习大礼包》,可以扫描下方二维码免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/860172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker常见问题-持续更新

docker 启动的问题解决 解决: 下载更新linux的win子系统, 重启就可以 WSL 2 installation is incomplete. 更加报错提示,猜测可能是我们使用的wsl2版本老了,需要我们自己手动更新一下,我们根据提示去微软官网下载最新版的wsl2安装后即可正常打开。更新包下载链接。 https://ws…

HBase:大数据时代的分布式存储利器

HBase:大数据时代的分布式存储利器 HBase:大数据时代的分布式存储利器1. HBase简介2. HBase特点3. HBase应用场景4. 总结 HBase:大数据时代的分布式存储利器 随着互联网和大数据技术的飞速发展,数据存储和计算需求呈现出爆炸式增…

Arduino - 串行绘图仪

Arduino - Serial Plotter Arduino - 串行绘图仪 In this tutorial, we will learn how to use the Serial Plotter on Arduino IDE, how to plot the multiple graphs. 在本教程中,我们将学习如何在Arduino IDE上使用串行绘图仪,如何绘制多个图形。 A…

webstorm无法识别@路径的问题,左键无法跳转

在项目根目录下创建 webstorm.config.js use strict; const webpackConfig require(vue/cli-service/webpack.config.js); module.exports webpackConfig;webstorm设置里找到以下位置,引入新建的 webstorm.config.js即可,不生效把webstorm重启一下

android Studio 无线开发调试: PC机远程安卓电脑 免费

背景 公司的安卓机比较大,还有连接着串口设备不好挪动。 但是遇到问题调试很麻烦。想找到一套远程调试方法。 实现 要求: adb android Studio 2023.3.1 安卓机IP:1928.168.1.228 直接用adb远程连接:adb connect 1928.168.1.228 默认端口…

HarmonyOS Next开发学习手册——ExtensionAbility

概述 EmbeddedUIExtensionAbility 是EMBEDDED_UI类型的ExtensionAbility组件,提供了跨进程界面嵌入的能力。 EmbeddedUIExtensionAbility需要和 EmbeddedComponent 一起配合使用,开发者可以在UIAbility的页面中通过EmbeddedComponent嵌入本应用的Embed…

读AI新生:破解人机共存密码笔记11智能爆炸

1. 大猩猩问题 1.1. 大约1000万年前,现代大猩猩的祖先创造了进化出现代人类的遗传谱系 1.1.1. 它们的物种基本上没有未来,除了我们屈尊所允许它们拥有的未来 1.1.2. 我们不希望在超级智能机器面前处于类似的地位 1.2. 大猩猩问题就是人类是否能在一个…

电脑提示msvcr120.dll丢失怎样修复

文件功能与重要性:msvcr120.dll 文件的功能和重要性体现在多个方面,以下是对其核心功能的详细分析: 运行时支持 msvcr120.dll 提供了运行时环境,使得使用 Microsoft Visual C 2013 编译的程序能够调用必要的运行时函数。这些函数…

Mysql----表的约束

提示:以下是本篇文章正文内容,下面案例可供参考 一、表的约束 表的约束:表中一定要有约束,通过约束让插入表中的数据是符合预期的。它的本质是通过技术手段,让程序员插入正确的数据,约束的最终目标是保证…

Java | Leetcode Java题解之第189题轮转数组

题目: 题解: class Solution {public void rotate(int[] nums, int k) {k % nums.length;reverse(nums, 0, nums.length - 1);reverse(nums, 0, k - 1);reverse(nums, k, nums.length - 1);}public void reverse(int[] nums, int start, int end) {whil…

【机器学习】图神经网络(NRI)模型原理和运动轨迹预测代码实现

1.引言 1.1.NRI研究的意义 在许多领域,如物理学、生物学和体育,我们遇到的系统都是由相互作用的组分构成的,这些组分在个体和整体层面上都产生复杂的动态。建模这些动态是一个重大的挑战,因为往往我们只能获取到个体的轨迹数据,而不知道其背后的相互作用机制或具体的动态…

Shardingsphere-Proxy 5.5.0数据迁移

Shardingsphere-Proxy 5.5.0数据迁移 Shardingsphere系列目录:背景配置集群部署搭建Zookeeper修改shardingsphere-proxy配置重启shardingsphere-proxy 执行数据迁移连接代理数据库实例(Navicate)应用代理数据库注册目标分片数据库存储单元创建…

如何将图片旋转任意角度?这四种方法轻松将图片旋转至任意角度!

如何将图片旋转任意角度?当我们涉及到图片时,常常会面临角度不佳的挑战,这一问题可能会给我们带来一系列不便,让我们深入探讨这些挑战,并探寻解决之道,首先,错误的角度可能导致视觉失真&#xf…

计算机Java项目|基于SpringBoot的音乐网站

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简…

【SQL Server数据库】带函数查询和综合查询(1)

目录 1.统计年龄大于30岁的学生的人数。 2.统计数据结构有多少人80分或以上。 3.查询“0203”课程的最高分的学生的学号。 4.统计各系开设班级的数目(系名称、班级数目),并创建结果表。 5.选修了以“01”开头的课…

C语言入门课程学习笔记9:指针

C语言入门课程学习笔记9 第41课 - 指针:一种特殊的变量实验-指针的使用小结 第42课 - 深入理解指针与地址实验-指针的类型实验实验小结 第43课 - 指针与数组(上)实验小结 第44课 - 指针与数组(下)实验实验小结 第45课 …

AI入门:AI发展势头这么猛,你在哪个阶段,落后了吗

生活的各方面都在发生着各种变化,笔者的教育生涯伴随着考试分数和排名,但现在的小学已经不公开分数和排名了,高考都屏蔽分数防止炒作了。 个人认为这是一个好的现象,教育就应该只有一个单纯的目的,那就是培养学生如何…

2024上海MWC 参展预告 | 未来先行,解锁数字化新纪元!

一、展会介绍——2024世界移动通信大会 2024年世界移动通信大会上海(MWC上海)将于6月26日至28日在上海新国际博览中心举行。 本届大会以“未来先行(Future First)”为主题聚焦“超越5G”、“数智制“人工智能经济’造”三大热点话题。届时将在包括超级品牌馆(Super Hall)在内…

Linux操作系统汇编语言基础知识(图文代码)

1、什么是汇编语言,它在计算机语言中的地位? 汇编语言是程序设计语言的基础语言,是唯一可以直接与计算机硬件打交道的语言2、汇编语言与源程序、汇编程序、汇编的关系? 3、汇编语言的特点 \1) 汇编语言与机器指令一一对应&#…

封装vuetify3中v-time-picker组件,并解决使用时分秒类型只能在修改秒之后v-model才会同步更新的问题

目前时间组件还属于实验室组件&#xff0c;要使用需要单独引入&#xff0c;具体使用方式查看官网 创建公共时间选择器组件 common-time-pickers.vue 子组件页面 <template><div><v-dialog v-model"props.timeItem.isShow" activator"parent&q…