IPython与现代数据科学工作流

IPython与现代数据科学工作流

【免费下载链接】ipython Official repository for IPython itself. Other repos in the IPython organization contain things like the website, documentation builds, etc. 【免费下载链接】ipython 项目地址: https://gitcode.com/gh_mirrors/ip/ipython

IPython作为Python交互式计算的核心环境,在现代数据科学工作流中扮演着至关重要的角色。本文深入探讨了IPython与matplotlib、pandas、numpy等核心数据科学库的深度集成,展示了其在数据可视化、并行计算、数据分析等方面的强大能力。文章详细介绍了IPython的魔法命令系统、后端架构、性能优化技巧以及在实际数据科学项目中的最佳实践,为构建高效、交互性强的数据分析环境提供了全面的指导。

数据可视化与matplotlib集成

IPython与matplotlib的深度集成为数据科学工作流提供了强大的可视化能力。这种集成不仅简化了交互式绘图过程,还优化了在Jupyter Notebook等环境中的图形显示体验。

matplotlib魔法命令

IPython提供了两个核心魔法命令来启用matplotlib支持:

# 启用matplotlib交互支持
%matplotlib inline

# 启用pylab模式(包含numpy和matplotlib导入)
%pylab inline
%matplotlib魔法命令

%matplotlib命令是激活matplotlib交互支持的主要方式:

%matplotlib [backend]

支持的常用backend选项包括:

  • inline: 在Notebook中内联显示图形
  • qt: 使用Qt后端
  • tk: 使用Tkinter后端
  • notebook: 使用交互式notebook后端
  • widget: 使用ipympl交互式部件
%pylab魔法命令

%pylab命令是一个更全面的解决方案,它不仅启用matplotlib,还自动导入numpy和matplotlib的常用模块:

%pylab [--no-import-all] [backend]

后端系统架构

IPython的matplotlib集成通过复杂的后端管理系统实现:

mermaid

图形显示与格式控制

IPython提供了精细的图形显示控制功能:

设置图形格式
from matplotlib_inline.backend_inline import set_matplotlib_formats

# 启用多种图形格式
set_matplotlib_formats('pdf', 'svg', 'png')

# 配置图形参数
%config InlineBackend.print_figure_kwargs = {
    'bbox_inches': None,
    'dpi': 150,
    'quality': 95
}
高分辨率显示
# 启用Retina显示
%config InlineBackend.figure_format = 'retina'

# 自定义图形尺寸
from IPython.core.pylabtools import figsize
figsize(12, 8)  # 设置默认图形大小

交互式图形功能

IPython支持多种交互式图形操作:

图形管理
from IPython.core.pylabtools import getfigs

# 获取所有图形
figures = getfigs()

# 获取特定图形
figure_1 = getfigs(1)[0]  # 获取图形1
内联后端配置
# 配置内联后端行为
%config InlineBackend.close_figures = False  # 保持图形打开
%config InlineBackend.rc = {
    'figure.figsize': (10, 6),
    'font.size': 12,
    'lines.linewidth': 2
}

集成工作流示例

以下是一个完整的数据可视化工作流示例:

# 启用matplotlib内联显示
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建图形
plt.figure(figsize=(10, 6))
plt.plot(x, y, 'b-', linewidth=2, label='sin(x)')
plt.plot(x, np.cos(x), 'r--', linewidth=2, label='cos(x)')

# 添加装饰
plt.title('三角函数可视化', fontsize=16)
plt.xlabel('X轴', fontsize=12)
plt.ylabel('Y轴', fontsize=12)
plt.legend()
plt.grid(True, alpha=0.3)

# 显示图形
plt.show()

高级集成特性

自定义图形格式器

IPython允许注册自定义图形格式器:

from IPython.core.display import display

def custom_figure_formatter(fig, fmt='png', **kwargs):
    """自定义图形格式器"""
    from IPython.core.pylabtools import print_figure
    return print_figure(fig, fmt=fmt, bbox_inches='tight', **kwargs)

# 注册格式器
ipython = get_ipython()
ipython.display_formatter.formatters['image/png'].for_type(
    plt.Figure, custom_figure_formatter
)
多后端支持

IPython支持动态后端切换:

# 动态切换后端
def switch_backend(backend_name):
    import matplotlib
    matplotlib.use(backend_name)
    import matplotlib.pyplot as plt
    plt.switch_backend(backend_name)
    
# 使用示例
switch_backend('Qt5Agg')  # 切换到Qt5后端

性能优化技巧

图形缓存管理
# 配置图形缓存
%config InlineBackend.cache_size = 50  # 缓存50个图形

# 清除图形缓存
plt.close('all')  # 关闭所有图形释放内存
批量图形处理
# 批量生成图形
figures = []
for i in range(5):
    fig, ax = plt.subplots(figsize=(8, 6))
    ax.plot(np.random.randn(100).cumsum())
    figures.append(fig)
    plt.close(fig)  # 关闭图形但保留引用

# 后续处理
for i, fig in enumerate(figures):
    display(fig)  # 按需显示

错误处理与调试

后端兼容性检查
def check_backend_compatibility():
    """检查后端兼容性"""
    from IPython.core.pylabtools import _list_matplotlib_backends_and_gui_loops
    available_backends = _list_matplotlib_backends_and_gui_loops()
    print("可用后端:", available_backends)
    
    # 检查当前后端
    import matplotlib
    current_backend = matplotlib.get_backend()
    print("当前后端:", current_backend)
图形显示问题排查
# 诊断图形显示问题
%config InlineBackend.print_figure_kwargs = {'bbox_inches': None}
%matplotlib --list  # 列出可用后端

最佳实践建议

  1. 环境配置: 在Notebook开头统一配置matplotlib
  2. 资源管理: 及时关闭不再需要的图形释放内存
  3. 格式标准化: 统一图形尺寸和样式配置
  4. 后端选择: 根据使用场景选择合适的前端
  5. 性能监控: 关注图形生成和显示的性能影响

通过IPython与matplotlib的深度集成,数据科学家可以在交互式环境中实现高效、美观的数据可视化,大大提升了数据探索和分析的效率。

并行计算与分布式处理

在现代数据科学工作流中,处理大规模数据和复杂计算任务已成为常态。IPython通过其强大的并行计算能力,为数据科学家提供了高效处理这些挑战的解决方案。虽然IPython的核心并行功能已迁移到独立的ipyparallel项目,但其集成和交互特性仍然为数据科学工作流提供了无缝的并行计算体验。

IPython并行架构概述

IPython的并行计算架构采用中心化的控制器-引擎模型,这种设计使得并行计算任务的分配和执行变得高度灵活和可扩展。整个系统由四个核心组件构成:

mermaid

核心组件详解

IPython引擎(Engine) 引擎是并行计算的工作节点,每个引擎都是一个完整的IPython解释器实例。它们监听网络请求,执行代码并返回结果。引擎支持:

  • 独立的命名空间和执行环境
  • 异步代码执行
  • 对象序列化和传输
  • 状态管理和监控

IPython控制器(Controller) 控制器是并行系统的协调中心,包含Hub和多个Scheduler进程:

  • Hub:维护集群状态,跟踪引擎连接和任务元数据
  • Scheduler:负责任务调度和负载均衡

客户端接口(Client) 客户端提供两种主要的并行编程模型:

接口类型特点适用场景
DirectView显式指定引擎精确控制任务分配
LoadBalancedView自动负载均衡大规模任务分发

快速开始并行计算

在IPython中启动并行计算环境非常简单:

import ipyparallel as ipp

# 创建包含4个引擎的本地集群
cluster = ipp.Cluster(n=4)
await cluster.start_cluster()

# 连接客户端
rc = cluster.connect_client_sync()

# 验证集群状态
print(f"可用引擎: {rc.ids}")  # 输出: [0, 1, 2, 3]

# 在所有引擎上执行简单任务
results = rc[:].apply_sync(lambda: "Hello from engine")
print(results)  # 输出: ['Hello from engine', ...]

并行编程模式

IPython支持多种并行编程范式,满足不同场景的需求:

1. 数据并行(Data Parallelism)

# 使用map操作实现数据并行
def process_data_chunk(data):
    # 数据处理逻辑
    return processed_result

data_chunks = split_data_into_chunks(large_dataset)
results = view.map(process_data_chunk, data_chunks)

2. 任务并行(Task Parallelism)

# 提交多个独立任务
async_results = []
for task in tasks:
    ar = view.apply_async(execute_task, task)
    async_results.append(ar)

# 等待所有任务完成并收集结果
results = [ar.get() for ar in async_results]

3. MPI集成并行

# 与MPI库集成
@view.remote(block=True)
def mpi_parallel_function():
    from mpi4py import MPI
    comm = MPI.COMM_WORLD
    rank = comm.Get_rank()
    # MPI并行计算逻辑
    return rank, computed_result

高级特性与优化技巧

动态负载均衡

# 创建负载均衡视图
lb_view = rc.load_balanced_view()

# 提交任务,自动分配到空闲引擎
results = lb_view.map(compute_intensive_task, task_list)

结果收集与监控

# 异步执行并监控进度
ar = view.apply_async(long_running_task)

# 实时监控任务状态
while not ar.ready():
    print(f"进度: {ar.progress}/{len(ar)}")
    time.sleep(1)

# 获取最终结果
final_result = ar.get()

错误处理与容错

try:
    # 执行可能失败的任务
    results = view.apply_sync(risky_computation)
except ipp.CompositeError as e:
    # 处理部分失败的情况
    successful_results = []
    for i, result in enumerate(e.args):
        if not isinstance(result, Exception):
            successful_results.append(result)
    print(f"成功完成 {len(successful_results)}/{len(view)} 个任务")

实际应用场景

大规模数据预处理

def preprocess_data(data_batch):
    # 数据清洗、转换、特征工程
    cleaned_data = clean_data(data_batch)
    features = extract_features(cleaned_data)
    return features

# 并行处理数据批次
data_batches = split_into_batches(raw_data, batch_size=1000)
processed_features = view.map(preprocess_data, data_batches)

超参数网格搜索

def train_model_with_params(params):
    model = create_model(**params)
    score = cross_validate(model, X_train, y_train)
    return params, score

# 并行搜索超参数空间
param_grid = generate_parameter_grid()
results = view.map(train_model_with_params, param_grid)
best_params = max(results, key=lambda x: x[1])[0]

模型集成与投票

def train_individual_model(seed):
    np.random.seed(seed)
    model = RandomForestClassifier(n_estimators=100)
    model.fit(X_train, y_train)
    return model

# 并行训练多个模型
seeds = range(10)
models = view.map(train_individual_model, seeds)

# 集成预测
def ensemble_predict(X):
    predictions = [model.predict_proba(X) for model in models]
    avg_prediction = np.mean(predictions, axis=0)
    return np.argmax(avg_prediction, axis=1)

性能优化建议

为了获得最佳的并行计算性能,考虑以下优化策略:

  1. 任务粒度调整:确保每个任务有足够的工作量来抵消通信开销
  2. 数据本地化:尽量减少引擎间的数据传输
  3. 资源监控:实时监控CPU和内存使用情况
  4. 故障恢复:实现检查点和重启机制
# 资源监控示例
def monitor_resources():
    import psutil
    return {
        'cpu_percent': psutil.cpu_percent(),
        'memory_usage': psutil.virtual_memory().percent,
        'disk_io': psutil.disk_io_counters()
    }

# 定期收集所有引擎的资源使用情况
resource_stats = view.apply_sync(monitor_resources)

IPython的并行计算框架为现代数据科学工作流提供了强大而灵活的基础设施。通过合理的架构设计和优化策略,可以显著加速数据处理、模型训练和仿真计算等任务,使数据科学家能够更高效地处理大规模复杂问题。

IPython与数据科学库的深度协同:pandas、numpy集成实践

IPython作为Python交互式计算的核心环境,在现代数据科学工作流中扮演着至关重要的角色。其与pandas、numpy等数据科学库的深度集成,为数据分析师和研究人员提供了无与伦比的交互体验和工作效率。本文将深入探讨IPython如何与这些核心数据科学库协同工作,展示其强大的集成能力和实用技巧。

核心集成机制

IPython通过多种机制与数据科学库实现深度集成:

1. 智能对象自省与显示

IPython的富显示系统能够智能识别和处理数据科学对象。当你在IPython中执行包含pandas DataFrame或numpy数组的代码时,IPython会自动调用对象的_repr_*_方法生成美观的格式化输出。

import pandas as pd
import numpy as np

# 创建示例DataFrame
df = pd.DataFrame({
    'A': np.random.randn(100),
    'B': np.random.randint(1, 100, 100),
    'C': pd.date_range('2023-01-01', periods=100, freq='D')
})

# IPython会自动格式化显示DataFrame
df.head()
2. 魔术命令集成

IPython提供了一系列专为数据科学设计的魔术命令,极大提升了工作效率:

# 性能分析魔术命令
%timeit df.groupby('B')['A'].mean()

# 内存使用分析
%memit large_array = np.random.rand(10000, 10000)

# 代码性能剖析
%prun analyze_large_dataset(df)
3. 自动补全与内省

IPython的智能补全系统能够理解数据科学库的结构:

# 输入df.后按Tab键,IPython会显示所有可用方法和属性
df.[TAB]

# 使用?获取详细文档
df.groupby?

数据可视化集成

IPython与matplotlib的集成让数据可视化变得异常简单:

%matplotlib inline
import matplotlib.pyplot as plt

# 直接在IPython中绘制图表
plt.figure(figsize=(10, 6))
plt.plot(df['C'], df['A'])
plt.title('时间序列数据')
plt.xlabel('日期')
plt.ylabel('数值')
plt.show()

高级集成特性

1. 自定义显示格式化器

IPython允许为特定数据类型注册自定义显示处理器:

from IPython.core.formatters import DisplayFormatter

def format_large_dataframe(df, include=None, exclude=None):
    """自定义DataFrame显示格式"""
    if len(df) > 1000:
        return f"大型DataFrame: {len(df)}行 × {len(df.columns)}列"
    return df._repr_html_()

# 注册自定义格式化器
formatter = get_ipython().display_formatter
formatter.for_type(pd.DataFrame, format_large_dataframe)
2. 异步执行支持

对于长时间运行的数据处理任务,IPython支持异步执行:

# 使用%%async魔术命令异步执行
%%async
result = process_large_dataset(df)
await result

# 或者使用await关键字
async_result = %timeit -o -r 1 df.groupby('B').agg({'A': ['mean', 'std']})
3. 进度显示集成

IPython与tqdm等进度条库完美集成:

from tqdm.notebook import tqdm
import time

# 在循环中显示进度条
for i in tqdm(range(100)):
    time.sleep(0.1)
    # 数据处理逻辑

实战案例:完整的数据分析工作流

下面展示一个完整的IPython与数据科学库协同工作的示例:

# 1. 数据加载与探索
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target

# 2. 数据概览
print("数据集形状:", df.shape)
df.info()
df.describe()

# 3. 可视化分析
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(12, 8))
sns.pairplot(df, hue='target', palette='viridis')
plt.suptitle('鸢尾花数据集特征关系图', y=1.02)

# 4. 性能分析
%timeit df.groupby('target').mean()
%memit correlation_matrix = df.corr()

# 5. 结果展示
from IPython.display import display, HTML

display(HTML("<h3>数据分析结果</h3>"))
display(df.corr().style.background_gradient(cmap='coolwarm'))

性能优化技巧

IPython提供了多种性能优化工具:

# 使用%run魔术命令运行优化脚本
%run -p optimize_data_processing.py

# 使用line_profiler进行逐行性能分析
%load_ext line_profiler
%lprun -f process_data process_data(df)

# 内存使用分析
%load_ext memory_profiler
%mprun -f clean_data clean_data(df)

调试与错误处理

IPython增强了数据科学工作流的调试能力:

# 使用%debug进行事后调试
try:
    result = problematic_data_operation(df)
except Exception as e:
    %debug

# 使用%pdb自动进入调试器
%pdb on
# 后续代码出错时会自动进入pdb

# 使用%xmode控制异常显示详细程度
%xmode verbose

集成扩展开发

你可以为IPython开发自定义的数据科学集成扩展:

from IPython.core.magic import magics_class, line_magic
from IPython.core.magic_arguments import magic_arguments, argument

@magics_class
class DataScienceMagics(Magics):
    
    @magic_arguments()
    @argument('dataframe', help='要分析的DataFrame')
    @line_magic
    def df_stats(self, line):
        """显示DataFrame的统计信息"""
        args = magic_arguments.parse_argstring(self.df_stats, line)
        df = self.shell.user_ns[args.dataframe]
        
        return {
            'shape': df.shape,
            'memory_usage': df.memory_usage(deep=True).sum(),
            'null_counts': df.isnull().sum(),
            'dtypes': df.dtypes
        }

# 注册魔术命令
ip = get_ipython()
ip.register_magics(DataScienceMagics)

工作流自动化

IPython支持将数据科学工作流保存和重现:

# 保存历史命令到文件
%history -f analysis_workflow.py

# 使用%store魔术命令保存变量
%store df
%store model

# 在其他会话中恢复
%store -r df
%store -r model

最佳实践总结

为了最大化IPython与数据科学库的协同效果,建议遵循以下最佳实践:

  1. 合理使用魔术命令:根据任务类型选择合适的性能分析工具
  2. 利用自动补全:充分利用Tab补全和内省功能提高编码效率
  3. 定制显示格式:为常用数据类型注册自定义显示格式化器
  4. 集成可视化:将matplotlib/seaborn与IPython显示系统紧密结合
  5. 性能监控:定期使用性能分析工具优化代码效率
  6. 错误处理:充分利用IPython的调试功能快速定位问题

通过深度集成IPython与pandas、numpy等数据科学库,你可以构建高效、交互性强的数据分析环境,显著提升数据科学工作的生产效率和质量。这种协同工作模式已经成为现代数据科学工作流的标准实践,为数据科学家提供了强大的工具支持。

数据科学项目中的最佳实践

在数据科学工作流中,IPython提供了强大的工具和功能来帮助开发者提高生产力、确保代码质量并优化性能。以下是在数据科学项目中使用IPython时应遵循的最佳实践。

性能优化与代码分析

IPython内置了多种性能分析工具,帮助开发者识别和解决性能瓶颈。

使用 %timeit 进行精确性能测量
# 测量单行代码执行时间
%timeit sum(range(1000))

# 测量多行代码(使用 %%timeit 魔术命令)
%%timeit
import numpy as np
arr = np.random.rand(1000, 1000)
result = arr.sum(axis=1)

最佳实践建议:

  • 使用 -n 参数控制循环次数,-r 参数控制重复次数
  • 对于长时间运行的代码,使用较小的 -n 值进行初步测试
  • 使用 -o 参数保存计时结果以便后续分析
# 保存计时结果进行分析
timeit_result = %timeit -o -n 1000 -r 5 some_function()

print(f"平均执行时间: {timeit_result.average:.6f} 秒")
print(f"标准差: {timeit_result.stdev:.6f} 秒")
print(f"最佳执行时间: {timeit_result.best:.6f} 秒")
使用 %prun 进行性能剖析
# 性能剖析示例
def process_data(data):
    # 复杂的数据处理逻辑
    result = []
    for item in data:
        processed = complex_operation(item)
        result.append(processed)
    return result

%prun process_data(large_dataset)

数据可视化与展示最佳实践

IPython提供了丰富的显示功能,可以优雅地展示数据分析结果。

多格式输出支持
from IPython.display import display, HTML, Markdown, JSON

# 显示HTML内容
display(HTML("<h2>数据分析报告</h2>"))

# 显示Markdown格式
display(Markdown("""
### 关键指标
- **准确率**: 95.2%
- **召回率**: 93.8%
- **F1分数**: 94.5%
"""))

# 显示JSON数据
data = {"model": "random_forest", "accuracy": 0.952, "features": 25}
display(JSON(data))
图像显示优化
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import display, Image

# 设置matplotlib为inline模式
%matplotlib inline

# 创建高质量图表
plt.figure(figsize=(10, 6))
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, 'b-', linewidth=2)
plt.title('正弦波形图', fontsize=14)
plt.xlabel('X轴', fontsize=12)
plt.ylabel('Y轴', fontsize=12)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

代码组织与可重复性

使用魔术命令管理依赖
# 记录和安装依赖
%pip freeze > requirements.txt
%pip install -r requirements.txt

# conda环境管理
%conda env export > environment.yml
%conda env create -f environment.yml
项目结构管理

mermaid

调试与错误处理

使用 %debug 进行事后调试
def problematic_function(x, y):
    try:
        result = x / y
        return result
    except Exception as e:
        print(f"错误发生: {e}")
        %debug  # 进入调试模式

# 调用可能出错的函数
problematic_function(10, 0)
使用 %xmode 控制错误显示详细程度
# 设置错误显示模式
%xmode Verbose  # 最详细的错误信息
%xmode Context  # 上下文信息
%xmode Plain    # 简洁错误信息

# 示例函数
def complex_calculation(a, b):
    intermediate = a * b
    result = intermediate / (a - b)
    return result

# 触发错误
complex_calculation(5, 5)

版本控制与协作

集成Git魔术命令
# Git状态检查
%git status

# 提交更改
%git commit -am "添加数据预处理功能"

# 差异比较
%git diff HEAD~1
代码质量检查
# 使用pyflakes进行静态分析
%load_ext pyflakes

# 自动检查代码质量
%%pyflakes
def example_function(x):
    unused_variable = 42  # 会被检测到未使用的变量
    return x * 2

自动化工作流

使用宏记录常用操作序列
# 创建宏来自动化重复任务
%macro data_cleaning 15-20  # 记录历史命令15-20行

# 执行宏
%macro data_cleaning

# 保存宏到文件
%save data_cleaning.py data_cleaning
定时任务执行
from IPython.lib.backgroundjobs import BackgroundJobManager

jobs = BackgroundJobManager()

# 在后台运行长时间任务
def train_model():
    # 模型训练代码
    pass

job_id = jobs.new(train_model)
print(f"后台任务ID: {job_id}")

# 检查任务状态
jobs.status()

文档与报告生成

使用Markdown和LaTeX集成
# 混合代码和文档
%%markdown
## 实验报告
本次实验使用随机森林算法,参数设置如下:
- n_estimators: 100
- max_depth: 10
- random_state: 42

**结果**: 准确率达到95.2%

%%latex
\\[
\\text{F1} = 2 \\times \\frac{\\text{precision} \\times \\text{recall}}{\\text{precision} + \\text{recall}}
\\]
生成交互式报告
from IPython.display import Javascript, HTML

# 添加交互元素
display(HTML("""
<div class="report">
    <button onclick="toggleDetails()">显示详细信息</button>
    <div id="details" style="display:none">
        <p>这里是详细的分析结果...</p>
    </div>
</div>
"""))

display(Javascript("""
function toggleDetails() {
    var details = document.getElementById('details');
    if (details.style.display === 'none') {
        details.style.display = 'block';
    } else {
        details.style.display = 'none';
    }
}
"""))

内存管理与优化

监控内存使用
# 使用 %memit 测量内存使用
%load_ext memory_profiler

def process_large_data():
    large_array = np.ones((1000, 1000))
    return large_array.sum()

%memit process_large_data()
清理内存
# 定期清理不再使用的变量
%xdel large_dataset  # 删除大变量

# 强制垃圾回收
import gc
gc.collect()

# 查看内存使用情况
%whos

通过遵循这些最佳实践,数据科学家可以充分利用IPython的强大功能,创建出高效、可维护且可重复的数据分析工作流。这些实践不仅提高了个人生产力,也促进了团队协作和项目可重复性。

总结

通过本文的全面探讨,我们可以看到IPython在现代数据科学工作流中的核心地位和强大功能。从数据可视化与matplotlib的深度集成,到并行计算与分布式处理的高效架构,再到与pandas、numpy等数据科学库的协同工作,IPython为数据科学家提供了全方位的工具支持。文章还详细介绍了性能优化、代码组织、调试技巧、版本控制、自动化工作流等最佳实践,帮助读者构建高效、可维护且可重复的数据分析环境。遵循这些实践,数据科学家可以显著提升工作效率和项目质量,充分发挥IPython在现代数据科学工作中的价值。

【免费下载链接】ipython Official repository for IPython itself. Other repos in the IPython organization contain things like the website, documentation builds, etc. 【免费下载链接】ipython 项目地址: https://gitcode.com/gh_mirrors/ip/ipython

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值