LightingLong 2025-01-13 18:10 采纳率: 83.3%
浏览 8
已结题

taichi无法调用第三方库函数

以下为源代码:

from requests import get
from bs4 import BeautifulSoup
import pygal
import taichi as ti


ti.init(arch=ti.gpu)
@ti.func
def get_data(data):
    name, rating, change = [], [], []
    for i in data:
        name.append(list(i)[4])
        rating.append(list(i)[5])
        change.append(list(i)[6])
    return name, rating, change


@ti.kernel
def main():
    bar = pygal.Bar()
    response = get('https://www.tiobe.com/tiobe-index/')
    soup = BeautifulSoup(response.text, 'html.parser')
    data = soup.find('table', {'id': 'top20'}).find('tbody').find_all('tr')
    # print(len(list(data)))
    name, rating, change = get_data(data)
    bar.title = 'TIOBE Index for January 2025'
    bar.x_labels = name
    bar.add('Rating', rating)
    bar.add('Change', change)
    bar.render_to_file('tiobe.svg')
    # print(name,rating,change)


main()

输出如下:

[Taichi] version 1.7.2, llvm 15.0.1, commit 0131dce9, win, python 3.12.6
[W 01/13/25 18:09:42.086 32604] [cuda_driver.cpp:taichi::lang::CUDADriverBase::load_lib@36] nvcuda.dll lib not found.
[Taichi] Starting on arch=vulkan
D:\PycharmProjects\tiobe\tiobe.py:20: SyntaxWarning: Calling non-taichi function "pygal.Bar". Scope inside the function is not processed by the Taichi AST transformer. The function may not work as expected. Proceed with caution! Maybe you can consider turning it into a @ti.func?
  bar = pygal.Bar()
Traceback (most recent call last):
  File "D:\PycharmProjects\tiobe\tiobe.py", line 34, in <module>
    main()
  File "D:\Program\Python\Lib\site-packages\taichi\lang\kernel_impl.py", line 1117, in wrapped
    raise type(e)("\n" + str(e)) from None
taichi.lang.exception.TaichiTypeError: 
File "D:\PycharmProjects\tiobe\tiobe.py", line 20, in main:
    bar = pygal.Bar()
    ^^^^^^^^^^^^^^^^^
Invalid constant scalar data type: <class 'pygal.graph.bar.Bar'>

  • 写回答

5条回答 默认 最新

  • GISer Liu 2025-01-13 22:59
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    问题分析

    用户在代码中使用了Taichi库进行GPU加速计算,但在调用第三方库pygal时遇到了问题。具体来说,Taichi在编译时无法处理pygal.Bar()的调用,导致程序抛出TaichiTypeError异常。问题的关键在于Taichi的@ti.kernel装饰器只能处理Taichi内部定义的数据类型和函数,而不能直接处理Python的普通函数和对象。

    关键点

    1. Taichi的限制:Taichi的@ti.kernel装饰器只能处理Taichi内部定义的数据类型和函数,不能直接调用Python的普通函数或对象。
    2. 第三方库调用pygal.Bar()是一个Python对象,Taichi无法直接处理它。
    3. 数据传递:Taichi的@ti.func函数可以处理Taichi内部的数据类型,但不能直接处理Python的普通数据类型。

    解决方案

    为了在Taichi中调用第三方库pygal,我们需要将pygal的调用部分移到Taichi的@ti.kernel函数之外。具体来说,可以在@ti.kernel函数中处理数据,然后将处理后的数据传递给Python的普通函数来生成图表。

    代码修改

    1. pygal.Bar()的调用移到@ti.kernel函数之外
    2. @ti.kernel函数中处理数据,并将处理后的数据返回给Python的普通函数

    修改后的代码

    from requests import get
    from bs4 import BeautifulSoup
    import pygal
    import taichi as ti
    
    ti.init(arch=ti.gpu)
    
    @ti.func
    def get_data(data):
        name, rating, change = [], [], []
        for i in data:
            name.append(list(i)[4])
            rating.append(list(i)[5])
            change.append(list(i)[6])
        return name, rating, change
    
    @ti.kernel
    def process_data(data: ti.template()) -> (ti.template(), ti.template(), ti.template()):
        name, rating, change = get_data(data)
        return name, rating, change
    
    def main():
        response = get('https://www.tiobe.com/tiobe-index/')
        soup = BeautifulSoup(response.text, 'html.parser')
        data = soup.find('table', {'id': 'top20'}).find('tbody').find_all('tr')
        
        # 调用Taichi的kernel函数处理数据
        name, rating, change = process_data(data)
        
        # 将处理后的数据传递给pygal生成图表
        bar = pygal.Bar()
        bar.title = 'TIOBE Index for January 2025'
        bar.x_labels = name
        bar.add('Rating', rating)
        bar.add('Change', change)
        bar.render_to_file('tiobe.svg')
    
    if __name__ == "__main__":
        main()
    

    代码解释

    1. process_data函数:这是一个Taichi的@ti.kernel函数,用于处理数据并返回处理后的结果。
    2. main函数:在main函数中,我们首先获取网页数据并解析,然后调用process_data函数处理数据,最后将处理后的数据传递给pygal.Bar()生成图表。

    总结

    通过将pygal.Bar()的调用移到Taichi的@ti.kernel函数之外,我们成功解决了Taichi无法调用第三方库函数的问题。这种分离数据处理和图表生成的方式,既利用了Taichi的GPU加速能力,又保留了Python第三方库的灵活性。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月23日
  • 已采纳回答 1月15日
  • 创建了问题 1月13日