鱼C论坛

 找回密码
 立即注册
查看: 519|回复: 3

如何加速?

[复制链接]
发表于 2024-6-30 17:16:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. def timer(f):
  2.     def inner():
  3.         time = __import__("time")
  4.         t1 = time.time()
  5.         f()
  6.         t2 = time.time()
  7.         print(t2-t1)
  8.     return inner
  9. @timer
  10. def ls():
  11.     global List
  12.     List = [[0 for _ in range(10000)] for _ in range(10000)]
  13. ls()
  14. @timer
  15. def f2():
  16.     for i in List:
  17.         for j in i:
  18.             j += 1      
  19. f2()
  20. @timer
  21. def f2():
  22.     for i in List:
  23.         for j in i:
  24.             pass      
  25. f2()
复制代码

时间分别为七秒多、四秒多、一秒多,这样肯定是不够的,怎么加速呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-6-30 17:18:34 | 显示全部楼层
你好,鱼油!看来你是想让代码运行得更快,但是看到你的代码后我觉得有些地方确实需要优化。先来看看问题所在:

1. 你在 `ls` 函数里初始化 `List` 时,似乎是漏掉了需要添加到列表中的元素。
2. 在 `f2` 函数中,你执行了两次并测量了时间,对于第一次版本中,你做了一个无意义的操作(`j += 1`),这会消耗很多时间。

但让我逐一解答你的疑问,并提供一些优化建议:

### 修复初始化问题
你的 `List` 初始化如下:
  1. def ls():
  2.     global List
  3.     # 注意下面这一行有误,需要修正
  4.     List = [ for _ in range(10000)]
复制代码

这里需要指定列表里的内容,比如生成一个含有10000个子列表的列表,每个子列表包含一定数量的整数。
  1. def ls():
  2.     global List
  3.     List = [[0] * 100 for _ in range(10000)] # 生成10000个长度为100的子列表
复制代码


### 优化循环操作
对于第一次 `f2` 函数里 `j += 1` 的操作,这是相对费时的。可以通过NumPy这样的库来进行优化,因为NumPy擅长处理大量数值计算任务。

  1. import numpy as np

  2. def ls():
  3.     global List
  4.     List = np.zeros((10000, 100))  # 使用NumPy数组

  5. @timer
  6. def f2():
  7.     # 矢量化操作,可以极大地提升性能
  8.     global List
  9.     List += 1
复制代码


### 时间装饰器改进
另外你的时间装饰器可以稍微改进一下,更加通用点:

  1. import time

  2. def timer(f):
  3.     def inner(*args, **kwargs):
  4.         t1 = time.time()
  5.         result = f(*args, **kwargs)
  6.         t2 = time.time()
  7.         print(f"{f.__name__} took {t2-t1:.4f} seconds")
  8.         return result
  9.     return inner
复制代码


### 无操作版本的优化
即使是无操作的版本,通过 NumPy 也可以提高性能:

  1. @timer
  2. def no_op_f2():
  3.     global List
  4.     pass  # 当然这个仍然没有实际操作,只是为了测时间
复制代码


综合这些,我们最终的代码应该是这样的:

  1. import time
  2. import numpy as np

  3. def timer(f):
  4.     def inner(*args, **kwargs):
  5.         t1 = time.time()
  6.         result = f(*args, **kwargs)
  7.         t2 = time.time()
  8.         print(f"{f.__name__} took {t2-t1:.4f} seconds")
  9.         return result
  10.     return inner

  11. # 初始化
  12. @timer
  13. def ls():
  14.     global List
  15.     List = np.zeros((10000, 100))

  16. # 执行操作     
  17. @timer
  18. def f2():
  19.     global List
  20.     List += 1  # 进行矢量化操作

  21. ls()
  22. f2()
  23. no_op_f2()
复制代码


希望这些技巧能帮你加速代码,请鼓掌:D
如果还有其他问题,请随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-6-30 17:19:28 | 显示全部楼层
FishC 发表于 2024-6-30 17:18
你好,鱼油!看来你是想让代码运行得更快,但是看到你的代码后我觉得有些地方确实需要优化。先来看看问题所 ...

回答不正确
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-30 17:19:39 | 显示全部楼层


抱歉,我刚才可能误解了你的代码和问题。让我再仔细看一遍并给出更合适的优化建议。

首先,我们需要确保`List`被正确初始化,再看如何优化代码的执行速度。

### 修复初始化问题

你在`ls`函数里初始化`List`时,似乎缺少了内容。我们假设你要生成一个包含10000个子列表,每个子列表包含100个随机数。

  1. import time
  2. import random

  3. def timer(f):
  4.     def inner(*args, **kwargs):
  5.         t1 = time.time()
  6.         result = f(*args, **kwargs)
  7.         t2 = time.time()
  8.         print(f"{f.__name__} took {t2-t1:.4f} seconds")
  9.         return result
  10.     return inner

  11. @timer
  12. def ls():
  13.     global List
  14.     List = [[random.randint(0, 100) for _ in range(100)] for _ in range(10000)]

  15. @timer
  16. def f2():
  17.     global List
  18.     for i in List:
  19.         for j in range(len(i)):
  20.             i[j] += 1     

  21. @timer
  22. def f2_no_op():
  23.     global List
  24.     for i in List:
  25.         for j in i:
  26.             pass

  27. ls()
  28. f2()
  29. f2_no_op()
复制代码


### 优化代码执行速度

1. **初始化 `List`**:使用列表生成表达式来创建列表是较高效的。
2. **`f2`中的操作**:你可以通过NumPy库来加速数值计算,尤其在大规模数据处理时。

如果允许使用第三方库,比如NumPy,可以尝试以下优化:

  1. import time
  2. import numpy as np

  3. def timer(f):
  4.     def inner(*args, **kwargs):
  5.         t1 = time.time()
  6.         result = f(*args, **kwargs)
  7.         t2 = time.time()
  8.         print(f"{f.__name__} took {t2-t1:.4f} seconds")
  9.         return result
  10.     return inner

  11. @timer
  12. def ls():
  13.     global List
  14.     List = np.random.randint(0, 100, size=(10000, 100))

  15. @timer
  16. def f2():
  17.     global List
  18.     List += 1  # 矢量化操作

  19. @timer
  20. def f2_no_op():
  21.     global List
  22.     pass  # 无操作仅用于计时

  23. ls()
  24. f2()
  25. f2_no_op()
复制代码


这样使用NumPy库进行矢量化操作可以显著提升性能。对于无操作的版本,确保代码逻辑保持一致,如有任何进一步细节需要说明,请告知。希望这些建议可以帮助你达到加速效果,如果还有问题,随时问我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 01:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表