面试题答案
一键面试优化方案
- 简化正则表达式:避免使用过于复杂或不必要的字符类和量词。例如,对于电子邮件地址验证,常见的结构是用户名@域名,用户名可以包含字母、数字、下划线、点等字符,域名由多个部分组成,每个部分由字母、数字、连字符组成,且部分之间用点分隔。
- 预编译正则表达式:使用
re.compile()
方法将正则表达式编译成模式对象,这样在多次使用时可以提高效率。
Python代码实现
import re
import timeit
# 优化前
def validate_email_basic(email):
return re.match(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', email) is not None
# 优化后
email_pattern = re.compile(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
def validate_email_optimized(email):
return email_pattern.match(email) is not None
# 从文件逐行读取并验证
def validate_emails_from_file_basic(file_path):
valid_emails = []
with open(file_path, 'r') as file:
for line in file:
email = line.strip()
if validate_email_basic(email):
valid_emails.append(email)
return valid_emails
def validate_emails_from_file_optimized(file_path):
valid_emails = []
with open(file_path, 'r') as file:
for line in file:
email = line.strip()
if validate_email_optimized(email):
valid_emails.append(email)
return valid_emails
性能差异分析
- 优化前:每次调用
re.match
时,Python需要重新编译正则表达式,这在处理大量电子邮件ID时会产生额外的开销。 - 优化后:通过预编译正则表达式,模式对象被缓存,每次调用
match
方法时无需重新编译,大大提高了验证效率。特别是在处理大型文本文件中的大量电子邮件ID时,优化后的代码在时间复杂度上会有显著提升。
可以通过timeit
模块来实际测量两者的性能差异:
file_path = 'large_email_list.txt'
basic_time = timeit.timeit(lambda: validate_emails_from_file_basic(file_path), number = 1)
optimized_time = timeit.timeit(lambda: validate_emails_from_file_optimized(file_path), number = 1)
print(f"优化前时间: {basic_time} 秒")
print(f"优化后时间: {optimized_time} 秒")
通常情况下,优化后的代码运行时间会明显少于优化前的代码,具体时间差异取决于文件中电子邮件ID的数量以及系统性能等因素。