PHP高性能编程经验分享:控制空间复杂度和时间复杂度

需积分: 10 2 下载量 192 浏览量 更新于2024-09-07 收藏 2KB TXT 举报
"PHP高性能编程经验分享" PHP高性能编程是指在编写PHP程序时,能够充分利用系统资源,提高程序的执行效率和响应速度。要写出高性能程序,不管是PHP、JAVA还是其他编程语言,不外乎就是控制程序的空间复杂度和时间复杂度。 空间复杂度是指程序执行过程中所占用的内存空间大小,时间复杂度是指程序执行过程中所需的时间长度。时间复杂度主要取决于算法的优劣,而空间复杂度则取决于变量赋值原理、字符串拼接、循环编写、内置函数使用等多个因素。 一、理解变量赋值原理 在PHP中,变量赋值有两种方式:值传递和地址引用。值传递是指将一个变量的值赋给另一个变量,而地址引用是指将一个变量的地址指向另一个变量。在PHP中,采用COPY-ON-WRITE(写时拷贝)机制,即只有当变量的值发生变化时,才会申请新的内存空间。 例如: $a='1232'; $b=$a;//这个是值传递,这里虽然是值传递,但PHP为了提升性能采用COPY-ON-WRITE【写时拷贝】,也就是说两个变量的地址指向的是同一地方。 $b="4546";//此时才会申请一块新的内存来赋值。 再举三个例子以便于理解: $a=array('a','cc','ds'); $b=$a; $b[1]='123';//此时才给$b变量申请内存块,并拷贝$a变量值到$b,最后赋值$b[1]的值为'123';$b的值为array('a','123','ds'); $a=new A(); $b=$a;//这里就是地址引用,执行同一地址 $a="12312312"; $b=&a;//这里就是地址引用,执行同一地址 二、字符串拼接 字符串拼接是指将多个字符串连接成一个字符串。在PHP中,有三种字符串拼接方式: 第一种:$s1=$s1.'456';//这种效率最低下 第二种:$s1.='456';//效率高 第三种:将它存入数组,最后使用implode函数拼接,效率高。 三、内置函数使用 PHP提供了许多内置函数,如array_map、array_filter等,这些函数都是用C语言编写的,执行效率高。如果有PHP内置函数,请尽量使用内置函数。 四、循环编写 循环编写是指在程序中使用循环语句,如for、while、foreach等。在编写循环时,尽量不要在循环体内重复申请内存空间,以免浪费系统资源。 五、变量释放 在PHP中,unset()函数可以释放变量占用的内存空间,特别是大集合的数组。 unset()函数可以释放变量的内存空间,但不能释放变量的值。 六、搜索和深入理解 在网上搜索到一些东西,例如字符串使用单引号、spilt分割explode函数效率高等等很多。但是,深刻理解以上几点,就可以很好的控制空间复杂度和时间复杂度,性能肯定不会差的。

from concurrent.futures import ThreadPoolExecutor from selenium import webdriver from selenium.webdriver.chrome.options import Options # 打开URL文件 with open('url.txt', 'r') as file: urls = file.read().splitlines() # 定义特定的域名 specific_domains = ['4qo4li.com:9516/register?i_code='] # 创建ChromeOptions对象 chrome_options = Options() chrome_options.add_argument("--incognito") # 启用无痕模式 def process_url(url): # 创建浏览器实例 driver = webdriver.Chrome(options=chrome_options) # 使用Chrome浏览器,需要下载对应的驱动并设置到环境变量中 # 构建完整的URL full_url = 'http://' + url + '/a/index.php/54545' # 打开浏览器并访问URL driver.get(full_url) # 等待页面跳转完成 driver.implicitly_wait(10) # 设置隐式等待时间,单位为秒 # 获取当前页面的URL current_url = driver.current_url # 判断当前页面的URL是否包含特定域名 if any(domain in current_url for domain in specific_domains): # 写入1.txt文本文件 with open('1.txt', 'a') as file: file.write(url + '\n') else: # 写入2.txt文本文件 with open('2.txt', 'a') as file: file.write(url + '\n') # 关闭浏览器 driver.quit() # 创建线程池 with ThreadPoolExecutor(max_workers=10) as executor: # 提交任务给线程池 futures = [executor.submit(process_url, url) for url in urls] # 等待所有任务完成 for future in futures: future.result() 帮我修改下代码 先把线程池处理原始的url列表,把失败的保存哎failed_urls.txt中等待所有的url遍历结束,再次打开failed_urls.txt中的url调用process_url函数来重新处理这些失败的URL然后判断是否仍然失败,如果仍然失败,则返回URL写入2.txt文件中,成功则返回URL写入1.txt

2023-07-17 上传