这个东西让我的Python代码快了100倍

Taichi是一款由中国开发者创建的Python DSL,专为高性能并行计算设计,尤其适合图形学和物理模拟。通过简单地添加注解,它可以将Python代码转换为GPU优化的版本,显著提高运行速度。例如,统计质数的代码在未使用Taichi时运行缓慢,但经过优化后,速度提升了30多倍,从原来的3.38秒缩短至0.1秒。Taichi不仅适用于学术界,也适用于日常编码,提供了一种有效提升Python代码执行效率的方法。

转载于Python数据挖掘。

Python 已经得到了全球程序员的喜爱,连续多期稳坐编程语言排行榜第一把交椅。但是还是遭到一些人的诟病,原因之一就是认为它运行缓慢。 要是有一款能够自动优化我们代码的神器该有多好啊!

于是,大家都在想尽各种办法来提高 Python 代码的运行速度,大多数体现在写代码的习惯优化以及代码优化上。但是平时写代码注意太多这些方面可能会有糟糕的体验,甚至会不利于我们的工作效率。

今天就给大家带来这样的一款神器——taichi,喜欢记得收藏、点赞。

文章目录

 

taichi

Taichi 起步于 MIT 的计算机科学与人工智能实验室(CSAIL),设计初衷是便利计算机图形学研究人员的日常工作,帮助他们快速实现适用于 GPU 的视觉计算和物理模拟算法。

说人话就是 Taichi 是一个基于 Python 的领域特定语言,专为高性能能并行计算设计。

本来是服务于学术界的一款 DSL ,但是我们也可以拿来用在我们这些凡夫俗子的代码中(虽然有点大材小用)!

安装

Taichi 是一个 PyPI 包,所以使用 pip 命令即可安装:

pip install taichi

注意 taichi 安装的先决条件是:

  • Python: 3.7/3.8/3.9/3.10 (64-bit)

  • OS: Windows, OS X, and Linux (64-bit)

在使用命令安装的时候,如果遇到错误,可以使用管理员模式命令行进行安装。

一个小例子

我们先来用一个小栗子,感受一下它的鬼斧神工!

import time
 
def is_prime(n):
    result = True
    for k in range(2, int(n**0.5) + 1):
        if n % k == 0:
            result = False
            break
    return result

def count_primes(n: int) -> int:
    count = 0
    for k in range(2, n):
        if is_prime(k):
            count += 1
    
    return count

t0 = time.time()
print(count_primes(100000))
t1 = time.time()

print(t1-t0)

这个是我们以前经常用来做例子的统计质数个数。求100000以内速度比较快,但是到了1000000,运行时间就明显慢了下来,竟然需要3.38秒。

Python 的大型 for 循环或嵌套 for 循环总是导致运行时性能不佳。

我们只需导入 Taichi 或切换到 Taichi 的 GPU 后端,就能看到整体性能的大幅提升:

import time
import taichi as ti

ti.init()

@ti.func
def is_prime(n):
    result = True
    for k in range(2, int(n**0.5) + 1):
        if n % k == 0:
            result = False
            break
    return result

@ti.kernel
def count_primes(n: int) -> int:
    count = 0
    for k in range(2, n):
        if is_prime(k):
            count += 1
    
    return count

t0 = time.time()
print(count_primes(1000000))
t1 = time.time()

print(t1-t0)
 

在这里,我们只需要引入 taichi 库,然后加两个注解,速度直接飙到了0.1秒,速度提升了30多倍。如果我们把数字再扩大,速度提升会更明显!

没有使用之前,统计10000000以内质数使用 90 秒,使用之后,并且更改为 GPU 运行,使用 0.1秒。

我们还可以将 Taichi 的后端从 CPU 更改为 GPU 运行:

总结

这个库是中国人发明的,它就是毕业于清华大学,后来去麻省理工学院进修的胡渊鸣

 

 

 

 

 

 

 

<think>我们已经在之前的代码中有了一个`_update_stats`方法,它会在每次状态更新时被调用。现在我们要在`_update_stats`中实现:如果饥饿度太高,健康度下降。 具体思路: 1. 在`__init__`方法中,我们可能需要添加一个健康度(health)属性,初始值设为100(假设健康度范围0-100)。 2. 在`_update_stats`方法中,检查当前饥饿度(hunger)是否超过某个阈值(比如80),如果超过,则健康度按照一定规则下降(比如每单位时间下降1点,或者根据超过的程度下降)。 3. 注意:健康度应该有一个下限(比如0)。 另外,我们还需要考虑时间的流逝。在之前的代码中,我们使用`last_update_time`来记录上次更新时间,然后计算时间差来更新状态。 考虑到引用[1]中提到的熵增原理,生物体如果饥饿(即无法摄入足够的负熵),则会导致混乱度增加(在这里表现为健康度下降)。我们可以这样设计: - 当饥饿度超过80时,健康度每小时下降5点(在程序里,我们可以按时间比例计算)。 - 注意:程序中的时间流逝可能是以秒为单位的,所以我们需要把小时转换为秒(1小时=3600秒)。 但是,由于我们之前的设计是每10秒更新一次状态,我们可以这样: - 在`_update_stats`方法中,计算自上次更新以来经过的时间(秒)。 - 然后,如果饥饿度大于80,则健康度下降 = (经过的秒数 / 3600) * 5。也就是说,每3600秒(1小时)下降5点。 不过,为了简单起见,我们也可以设定为:每次调用`_update_stats`时,如果饥饿度大于80,则健康度立即下降(比如每次下降1点)。但是这样下降速度会与调用频率有关,不够合理。 因此,我们采用基于时间流逝的下降方式。 修改步骤: 1. 在`__init__`中添加`health`属性,初始为100。 2. 在`_update_stats`方法中,首先计算时间差(秒),然后按照时间差更新其他状态(如饥饿度增加等),然后检查饥饿度,如果超过80,则计算健康度下降值。 另外,我们还可以设定:当饥饿度非常高(比如超过90)时,健康度下降更(比如每小时10点)。 具体代码实现如下: 注意:由于原代码中已经有了`last_update_time`和`_update_stats`方法框架,我们在此基础上补充。 另外,原代码中已经有饥饿度属性(`hunger`),我们只需要在更新饥饿度后,根据当前的饥饿度来降低健康度。 我们假设健康度的更新公式为: - 当饥饿度在80到90之间时,每小时下降5点(即每秒下降5/3600点) - 当饥饿度大于等于90时,每小时下降10点(即每秒下降10/3600点) 同时,为了避免健康度低于0,我们使用`max(0, ...)`。 代码修改示例: ```python class VirtualPet: """虚拟宠物类""" def __init__(self, name, species="未知生物"): self.name = name self.species = species self.hunger = 50 # 饥饿度,0-100,0表示不饿,100表示非常饿 self.happiness = 50 # 乐度 self.energy = 50 # 精力 self.health = 100 # 健康度,0-100 self.is_sleeping = False self.last_update_time = time.time() # 记录上次更新时间 def _update_stats(self): """随时间更新宠物状态""" current_time = time.time() time_elapsed = current_time - self.last_update_time # 经过的秒数 self.last_update_time = current_time # 如果宠物在睡觉,则精力恢复,饥饿度也会增加(但比醒着慢?) # 如果宠物醒着,精力会缓慢下降,饥饿度增加 if self.is_sleeping: self.energy = min(100, self.energy + 0.1 * time_elapsed) # 每秒恢复0.1点精力 self.hunger = min(100, self.hunger + 0.05 * time_elapsed) # 睡觉时饥饿度增加较慢 else: self.energy = max(0, self.energy - 0.05 * time_elapsed) # 每秒消耗0.05点精力 self.hunger = min(100, self.hunger + 0.1 * time_elapsed) # 每秒增加0.1点饥饿度 # 如果饥饿度太高,健康度下降(根据引用[1]的熵增原理) if self.hunger >= 80: # 根据饥饿度不同,健康度下降速度不同 if self.hunger >= 90: health_decrease = 10 * (time_elapsed / 3600) # 每小时10点 else: health_decrease = 5 * (time_elapsed / 3600) # 每小时5点 self.health = max(0, self.health - health_decrease) # 注意:我们还可以添加其他状态更新,比如乐度随时间缓慢下降等 # ... ``` 同时,我们还需要在喂食(feed)方法中,当喂食时降低饥饿度,并且有可能间接影响到健康度(因为饥饿度降低后,健康度就不会继续下降,甚至我们可以设定当饥饿度很低时,健康度缓慢恢复?)。不过题目要求只补充饥饿度太高时健康度下降的代码,所以先按需求来。 另外,在其他方法(如`status`)中,我们会调用`_update_stats`,这样就保证了状态的实时更新。 注意:健康度下降后,我们可能需要在看兽医(`take_to_vet`)方法中恢复健康度,但目前题目没有要求,所以暂不修改。 以上就是在虚拟宠物程序中补充饥饿值太高时健康值下降的代码。 </think>根据您的需求,我将为虚拟宠物程序补充饥饿值过高导致健康值下降的功能,并完善相关代码。以下是完整实现: ```python import random import time class VirtualPet: """虚拟宠物类:模拟生物新陈代谢与熵增原理[^1]""" MOODS = { "happy": "😄", "sad": "😢", "hungry": "😋", "sick": "🤧", "tired": "😴" } def __init__(self, name, species="未知生物"): self.name = name self.species = species self.hunger = random.randint(40, 60) # 饥饿度(0-100) self.happiness = random.randint(50, 70) # 乐度(0-100) self.energy = 80 # 精力值(0-100) self.health = 100 # 健康度(0-100) self.is_sleeping = False self.last_update_time = time.time() def _update_stats(self): """随时间更新宠物状态(模拟熵增过程[^1])""" current_time = time.time() elapsed_time = current_time - self.last_update_time self.last_update_time = current_time # 熵增效应:随时间自然增加的混乱度 entropy_rate = 0.02 # 每秒熵增加量 entropy = entropy_rate * elapsed_time # 饥饿度随时间自然增加(熵增) self.hunger = min(100, self.hunger + entropy * 2) # 精力随时间自然减少(熵增) if not self.is_sleeping: self.energy = max(0, self.energy - entropy) # 如果饥饿度太高,健康度下降(新陈代谢紊乱) if self.hunger > 80: # 饥饿度与健康下降关系公式: $health\_decrease = \frac{(hunger - 80)}{5} \times entropy$ health_decrease = (self.hunger - 80) / 5 * entropy self.health = max(0, self.health - health_decrease) # 健康度低于50时触发生病状态 if self.health < 50: self.happiness = max(0, self.happiness - entropy * 2) # 精力过低影响乐度 if self.energy < 20: self.happiness = max(0, self.happiness - entropy) def feed(self, food="普通食物"): """喂食宠物(摄入负熵[^1])""" self._update_stats() if self.is_sleeping: print(f"{self.name} 正在睡觉,不要打扰它!") return food_effects = { "普通食物": (20, 5), "美味大餐": (40, 10), "零食": (10, 2), "健康食品": (25, 15) } hunger_decrease, health_increase = food_effects.get(food, (15, 5)) # 减少饥饿度(摄入负熵) self.hunger = max(0, self.hunger - hunger_decrease) # 健康食品额外增加健康度 if food == "健康食品": self.health = min(100, self.health + health_increase) print(f"🍖 {self.name} 吃了 {food},饥饿度-{hunger_decrease}") def play(self, game="捉迷藏"): """和宠物玩耍(消耗熵的过程)""" self._update_stats() if self.is_sleeping: print(f"{self.name} 正在睡觉,让它好好休息吧!") return if self.energy < 20: print(f"{self.name} 太累了,不想玩耍...") return game_effects = { "捉迷藏": (15, 10), "接飞盘": (20, 15), "智力游戏": (10, 20) } happiness_increase, energy_decrease = game_effects.get(game, (10, 10)) self.happiness = min(100, self.happiness + happiness_increase) self.energy = max(0, self.energy - energy_decrease) print(f"🎮 {self.name} 玩了 {game},乐度+{happiness_increase},精力-{energy_decrease}") def sleep(self): """让宠物睡觉(恢复负熵)""" self._update_stats() if self.is_sleeping: print(f"{self.name} 已经在睡觉了...") return self.is_sleeping = True print(f"💤 {self.name} 开始睡觉了...") # 模拟睡觉过程(每秒恢复精力) sleep_duration = random.randint(5, 15) # 睡眠时间5-15秒 start_time = time.time() while time.time() - start_time < sleep_duration: self.energy = min(100, self.energy + 3) self.health = min(100, self.health + 1) time.sleep(1) self.is_sleeping = False print(f"🌞 {self.name} 醒了,精力恢复!") def take_to_vet(self): """带宠物看兽医(修复健康状态)""" self._update_stats() if self.health >= 100: print(f"{self.name} 很健康,不需要看医生!") return # 健康恢复公式:$health\_increase = \frac{(100 - health)}{2}$ health_increase = (100 - self.health) / 2 self.health = min(100, self.health + health_increase) print(f"🏥 {self.name} 看了兽医,健康度+{health_increase:.1f}") def get_mood(self): """获取宠物当前情绪""" self._update_stats() if self.hunger > 80: return "hungry" if self.health < 50: return "sick" if self.energy < 20: return "tired" if self.happiness > 70: return "happy" return "sad" def status(self): """显示宠物状态(熵状态可视化)""" self._update_stats() mood = self.get_mood() mood_emoji = self.MOODS[mood] print(f"\n🐾 {self.name} ({self.species}) 状态 {mood_emoji}") print(f"饥饿度: {'🍖' * (self.hunger // 10)}{'◻' * (10 - self.hunger // 10)} {self.hunger}/100") print(f"乐度: {'❤️' * (self.happiness // 10)}{'♡' * (10 - self.happiness // 10)} {self.happiness}/100") print(f"健康度: {'💊' * (self.health // 10)}{'◻' * (10 - self.health // 10)} {self.health}/100") print(f"精力值: {'🔋' * (self.energy // 10)}{'◻' * (10 - self.energy // 10)} {self.energy}/100") def speak(self): """宠物说话(根据情绪)""" mood = self.get_mood() responses = { "happy": ["开心!", "好玩!", "喜欢主人!"], "sad": ["不开心...", "想出去玩", "感到孤单"], "hungry": ["好饿啊...", "想吃东西", "肚子咕咕叫"], "sick": ["不舒服...", "需要看医生", "难受"], "tired": ["好累...", "想睡觉", "没力气"] } print(f"{self.name}: {random.choice(responses[mood])}") # 示例用法 if __name__ == "__main__": pet = VirtualPet("小熵", "熵控生物") print("----- 虚拟宠物模拟 -----") print("基于熵增原理的宠物系统[^1]") pet.status() pet.feed("健康食品") pet.play("捉迷藏") pet.sleep() pet.take_to_vet() pet.speak() pet.status() ``` ### 关键实现说明: 1. **熵增原理实现**: - 在`_update_stats()`方法中添加熵增逻辑,随时间自然增加饥饿度并减少精力值 - 实现饥饿度影响健康度的公式: $$health\_decrease = \frac{(hunger - 80)}{5} \times entropy$$ - 当饥饿度 > 80 时触发健康值下降(新陈代谢紊乱) 2. **生物建模**: - 健康食品可增加健康度(补充负熵[^1]) - 睡眠可恢复健康和精力(熵减过程) - 健康值低于50时触发生病状态,影响乐度 3. **状态可视化**: - 使用emoji显示各项状态(🍖表示饥饿度,💊表示健康度) - 情绪系统基于当前状态自动判断 - 状态值使用进度条直观展示 ### 使用示例: ```python # 创建宠物 my_pet = VirtualPet("熵熵", "量子生物") # 日常照顾 my_pet.feed("健康食品") # 摄入负熵 my_pet.play("智力游戏") # 消耗熵 my_pet.sleep() # 恢复负熵 my_pet.status() # 查看熵状态 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值