当前位置:首页>python>【AI基石】Python工具链(三):PyTorch入门 —— 炼丹炉已开,把 NumPy 扔进显卡里!

【AI基石】Python工具链(三):PyTorch入门 —— 炼丹炉已开,把 NumPy 扔进显卡里!

  • 2026-01-12 19:42:39
【AI基石】Python工具链(三):PyTorch入门 —— 炼丹炉已开,把 NumPy 扔进显卡里!

前言

在上一篇,我们手握 NumPy 和 Pandas,觉得自己已经能处理全世界的数据了。

但当你试图用 NumPy 手写一个神经网络时,你会撞上两堵墙:

  1. 1. 算不动:矩阵一旦超过 10000 维,CPU 就开始发烫降频,NumPy 对此无能为力。
  2. 2. 算不准:还记得微积分里的“链式法则”吗?如果神经网络有 100 层,手推导数公式会让你崩溃。只要写错一个符号,整个模型就废了。

今天,我们请出 AI 界的“屠龙刀” —— PyTorch。

它由 Meta (Facebook) 开源,它做对了最关键的两件事:

  1. 1. 把张量搬到了 GPU 上(解决了“算不动”)。
  2. 2. 实现了自动微分系统 Autograd(解决了“算不准”)。

系好安全带,我们要开始真正的“硬核”编程了。


一、 Tensor (张量):觉醒了“原力”的 NumPy

PyTorch 的 Tensor 在语法上几乎和 NumPy 的 ndarray 一模一样。这不是巧合,而是为了降低迁移成本。但 Tensor 多了两个核心属性:device(设备)和 grad(梯度)。

1. 设备感知:CPU vs GPU

NumPy 只能在 CPU 上跑,而 Tensor 可以随意切换领地。

import torchimport numpy as npprint(f"PyTorch版本: {torch.__version__}")print(f"CUDA可用: {torch.cuda.is_available()}")print(f"CUDA版本: {torch.version.cuda}")print(f"可用设备数: {torch.cuda.device_count()}")print(f"当前设备: {torch.cuda.current_device()}")print(f"设备名称: {torch.cuda.get_device_name(0) if torch.cuda.device_count() > 0 else '无GPU'}")# 1. 创建 Tensor (和 NumPy 极其相似)x_np = np.array([1, 2, 3])x_pt = torch.tensor([1, 2, 3])  # 默认在 CPU# 2. 桥接 NumPy# 两者共享内存!修改一个,另一个也会变(如果在CPU上)y_pt = torch.from_numpy(x_np)# 3. --- 硬核时刻:搬运到 GPU ---if torch.cuda.is_available():    # 这行代码是深度学习加速 100 倍的关键    device = torch.device("cuda")    x_cuda = x_pt.to(device)    print(f"数据在: {x_cuda.device}")    # 注意:GPU 上的张量不能直接和 NumPy 交互,必须先 .cpu() 搬回来    result = x_cuda.cpu().numpy()    print(result)else:    print("没有显卡,只能用 CPU 跑代码,惨。")# PyTorch版本: 2.9.1+cu126# CUDA可用: True# CUDA版本: 12.6# 可用设备数: 1# 当前设备: 0# 设备名称: NVIDIA GeForce RTX 3060# 数据在: cuda:0# [1 2 3]

干货 Tip:在写代码时,养成定义 device 的习惯,这是从脚本小子进阶到工程化的第一步。

2. 动态图机制 (Dynamic Computational Graph)

这是 PyTorch 战胜 TensorFlow 1.x 的杀手锏。

  • • TensorFlow (旧版):先定义图(像画好电路板),再灌水(数据)。一旦出错,不知道是哪条线烧了。
  • • PyTorch边执行边建图。代码运行到哪,图就建到哪。你可以用 Python 的 if/else 随意控制网络结构。

二、 Autograd:自动微分的“黑魔法”

这是本篇最核心的干货。PyTorch 是如何知道怎么求导的?

当你创建一个 Tensor 并设置 requires_grad=True 时,PyTorch 就不再只把它看作一个数据,而是一个计算图的节点

1. 追踪历史 (Tracking History)

PyTorch 会在后台启动一个“书记员”,记录你对这个张量做的每一次运算。

# 创建一个需要求导的张量 w (比如权重)w = torch.tensor(1.0, requires_grad=True)x = torch.tensor(2.0)# 定义运算y = w * x       # 第一步:乘法z = y ** 2      # 第二步:平方# 此时,PyTorch 悄悄建立了一张图:# w -> [Mul] -> y -> [Pow] -> z

2. 反向传播 (Backward)

当你调用 z.backward() 时,PyTorch 会沿着刚才那张图反向跑一遍,利用链式法则自动计算出 z 对 w 的导数,并存入 w.grad 中。

z.backward()# 手推验证:# z = (wx)^2# dz/dw = 2(wx) * x = 2 * (1*2) * 2 = 8print(f"PyTorch 算的导数: {w.grad}") # 输出 8.0

干货 Tip

  • • Leaf Node (叶子节点):像 w 这种我们自己创建的变量,才有梯度。像 y 和 z 这种中间运算结果,梯度在反向传播后会被释放以节省内存。
  • • grad_fn:你可以打印 z.grad_fn,会发现它叫 <PowBackward0>,这就是 PyTorch 记录的“运算历史”。

三、 实战:手写线性回归(从原理到框架)

为了让你彻底理解框架的封装艺术,我们用两种方式实现同一个线性回归任务:拟合 

方式一:低阶实现(手动挡)

这种写法能让你看清 PyTorch 到底在干什么。

import torch# 1. 准备数据X = torch.rand(100, 1)y = 3 * X + 0.8 + 0.05 * torch.randn(100, 1) # 加点噪音# 2. 初始化参数 (随机猜)w = torch.randn(1, 1, requires_grad=True)b = torch.randn(1, 1, requires_grad=True)learning_rate = 0.1for epoch in range(1000):    # --- Forward (前向传播) ---    y_pred = X @ w + b  # 矩阵乘法    # --- Loss (计算误差) ---    loss = (y_pred - y).pow(2).mean() # MSE Loss    # --- Backward (反向传播) ---    # 这一步会自动把 dLoss/dw 和 dLoss/db 算出来,存进 w.grad 和 b.grad    loss.backward()    # --- Update (更新参数) ---    # 核心干货:为什么要用 no_grad?    # 因为更新参数 w = w - lr * grad 是一个计算操作。    # 如果不关掉梯度追踪,PyTorch 会以为这步操作也要算进计算图里,导致无限套娃和内存爆炸。    with torch.no_grad():        w -= learning_rate * w.grad        b -= learning_rate * b.grad        # 核心干货:为什么要 zero_grad?        # PyTorch 的梯度默认是“累加”的(为了支持 RNN 等复杂网络)。        # 在下一轮迭代前,必须把上一轮的梯度清零!        w.grad.zero_()        b.grad.zero_()    if epoch % 100 == 0:        print(f"Epoch {epoch}: w={w.item():.2f}, b={b.item():.2f}")# Epoch 0: w=1.51, b=-1.53# Epoch 100: w=2.95, b=0.82# Epoch 200: w=2.99, b=0.80# Epoch 300: w=3.00, b=0.80# Epoch 400: w=3.00, b=0.80# Epoch 500: w=3.00, b=0.80# Epoch 600: w=3.00, b=0.80# Epoch 700: w=3.00, b=0.80# Epoch 800: w=3.00, b=0.80# Epoch 900: w=3.00, b=0.80

方式二:高阶实现(自动挡)

这才是 AI 工程师每天写的代码。 我们使用 torch.nn (Neural Network) 和 torch.optim (Optimizer)。

import torchimport torch.nn as nnimport torch.optim as optimimport matplotlib.pyplot as plt# ==================== 设置随机种子 ====================torch.manual_seed(42)# ==================== 创建训练数据 y = 3x + 0.8 ====================# 生成更多数据点n_samples = 100X = torch.randn(n_samples, 1) * 2  # 生成-2到2之间的随机数,增加数据范围true_w = 3.0true_b = 0.8noise = torch.randn(n_samples, 1) * 0.2  # 添加少量噪声y = true_w * X + true_b + noiseprint("=" * 60)print("数据生成信息:")print("=" * 60)print(f"样本数量: {n_samples}")print(f"真实关系: y = {true_w:.1f}x + {true_b:.1f}")print(f"X范围: [{X.min():.2f}, {X.max():.2f}]")print(f"y范围: [{y.min():.2f}, {y.max():.2f}]")print(f"添加噪声: 标准差 {noise.std():.3f}")# ==================== 检查 GPU 可用性 ====================device = torch.device("cuda" if torch.cuda.is_available() else "cpu")print(f"\n使用设备: {device}")# ==================== 可视化原始数据 ====================plt.figure(figsize=(12, 4))plt.subplot(1, 3, 1)plt.scatter(X.cpu().numpy(), y.cpu().numpy(), alpha=0.5, label='数据点')plt.plot(X.cpu().numpy(), (true_w * X + true_b).cpu().numpy(),         'r-', linewidth=3, label=f'真实: y={true_w}x+{true_b}')plt.xlabel('X')plt.ylabel('y')plt.title('原始数据 (y=3x+0.8)')plt.legend()plt.grid(True, alpha=0.3)# ==================== 1. 定义模型 ====================class LinearRegressionModel(nn.Module):    def __init__(self):        super().__init__()        self.linear = nn.Linear(1, 1)    def forward(self, x):        return self.linear(x)# 创建模型并移到设备model = LinearRegressionModel().to(device)print(f"\n模型初始参数:")print(f"初始权重: {model.linear.weight.item():.4f}")print(f"初始偏置: {model.linear.bias.item():.4f}")# ==================== 移动数据到设备 ====================X_gpu = X.to(device)y_gpu = y.to(device)# ==================== 2. 定义损失函数和优化器 ====================criterion = nn.MSELoss()optimizer = optim.SGD(model.parameters(), lr=0.01)# 添加学习率调度器(可选,让训练更稳定)scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=200, gamma=0.9)# ==================== 3. 训练循环 ====================print("\n" + "=" * 60)print("开始训练...")print("=" * 60)losses = []  # 记录损失weights = []  # 记录权重变化biases = []  # 记录偏置变化for epoch in range(2000):    # 训练步骤    optimizer.zero_grad()    outputs = model(X_gpu)    loss = criterion(outputs, y_gpu)    loss.backward()    optimizer.step()    scheduler.step()  # 更新学习率    # 记录    losses.append(loss.item())    weights.append(model.linear.weight.item())    biases.append(model.linear.bias.item())    # 打印进度    if (epoch + 1) % 200 == 0:        current_lr = scheduler.get_last_lr()[0]        print(f'Epoch [{epoch + 1:4d}/2000], Loss: {loss.item():.6f}, '              f'LR: {current_lr:.5f}, '              f'w: {model.linear.weight.item():.4f}, '              f'b: {model.linear.bias.item():.4f}')# ==================== 4. 查看训练结果 ====================print("\n" + "=" * 60)print("训练完成!")print("=" * 60)final_w = model.linear.weight.item()final_b = model.linear.bias.item()print(f"\n真实关系: y = {true_w:.4f}x + {true_b:.4f}")print(f"学习到的: y = {final_w:.4f}x + {final_b:.4f}")print(f"权重误差: {abs(final_w - true_w):.4f}")print(f"偏置误差: {abs(final_b - true_b):.4f}")# ==================== 5. 可视化训练过程 ====================plt.subplot(1, 3, 2)plt.plot(losses)plt.xlabel('Epoch')plt.ylabel('Loss (MSE)')plt.title('训练损失曲线')plt.grid(True, alpha=0.3)plt.yscale('log')  # 对数坐标更清晰plt.subplot(1, 3, 3)plt.plot(weights, label='权重 w')plt.plot(biases, label='偏置 b')plt.axhline(y=true_w, color='r', linestyle='--', alpha=0.5, label='真实 w')plt.axhline(y=true_b, color='g', linestyle='--', alpha=0.5, label='真实 b')plt.xlabel('Epoch')plt.ylabel('参数值')plt.title('参数收敛过程')plt.legend()plt.grid(True, alpha=0.3)plt.tight_layout()plt.show()# ==================== 6. 最终拟合效果可视化 ====================plt.figure(figsize=(10, 6))plt.scatter(X.cpu().numpy(), y.cpu().numpy(), alpha=0.5, label='数据点')# 真实直线x_range = torch.linspace(X.min(), X.max(), 100).reshape(-1, 1)y_true = true_w * x_range + true_bplt.plot(x_range.numpy(), y_true.numpy(), 'r-', linewidth=3,         label=f'真实: y={true_w:.2f}x+{true_b:.2f}')# 预测直线model.eval()with torch.no_grad():    x_range_gpu = x_range.to(device)    y_pred = model(x_range_gpu).cpu()plt.plot(x_range.numpy(), y_pred.numpy(), 'b--', linewidth=3,         label=f'拟合: y={final_w:.2f}x+{final_b:.2f}')plt.xlabel('X')plt.ylabel('y')plt.title(f'线性回归拟合结果 (y={true_w}x+{true_b})')plt.legend()plt.grid(True, alpha=0.3)plt.show()# ==================== 7. 详细参数分析 ====================print("\n" + "=" * 60)print("详细参数分析")print("=" * 60)# 查看模型的所有参数和梯度model.train()  # 切回训练模式以查看梯度dummy_loss = criterion(model(X_gpu), y_gpu)dummy_loss.backward()for name, param in model.named_parameters():    print(f"\n{name}:")    print(f"  数值: {param.data.cpu().numpy().flatten()}")    print(f"  梯度: {param.grad.cpu().numpy().flatten() if param.grad is not None else 'None'}")    print(f"  是否需要梯度: {param.requires_grad}")# ==================== 8. 测试预测 ====================print("\n" + "=" * 60)print("测试预测")print("=" * 60)test_X = torch.tensor([[0.5], [1.0], [1.5], [2.0], [2.5]]).to(device)model.eval()with torch.no_grad():    predictions = model(test_X)    print(f"{'输入 x':>10} | {'预测 y':>10} | {'真实 y':>10} | {'误差':>10}")    print("-" * 50)    for i, x in enumerate(test_X.cpu()):        pred = predictions[i].cpu().item()        truth = true_w * x.item() + true_b        error = abs(pred - truth)        print(f"{x.item():10.2f} | {pred:10.4f} | {truth:10.4f} | {error:10.4f}")print("\n" + "=" * 60)print("模型训练完成!")print(f"最终损失: {losses[-1]:.6f}")print("=" * 60)============================================================# 数据生成信息:# ============================================================# 样本数量: 100# 真实关系: y = 3.0x + 0.8# X范围: [-4.41, 4.44]# y范围: [-12.35, 13.88]# 添加噪声: 标准差 0.178# 使用设备: cuda# 模型初始参数:# 初始权重: 0.4801# 初始偏置: 0.8415# ============================================================# 开始训练...# ============================================================# Epoch [ 200/2000], Loss: 0.031221, LR: 0.00900, w: 3.0011, b: 0.8096# Epoch [ 400/2000], Loss: 0.031214, LR: 0.00810, w: 3.0012, b: 0.8072# Epoch [ 600/2000], Loss: 0.031214, LR: 0.00729, w: 3.0012, b: 0.8071# Epoch [ 800/2000], Loss: 0.031214, LR: 0.00656, w: 3.0012, b: 0.8071# Epoch [1000/2000], Loss: 0.031214, LR: 0.00590, w: 3.0012, b: 0.8071# Epoch [1200/2000], Loss: 0.031214, LR: 0.00531, w: 3.0012, b: 0.8071# Epoch [1400/2000], Loss: 0.031214, LR: 0.00478, w: 3.0012, b: 0.8071# Epoch [1600/2000], Loss: 0.031214, LR: 0.00430, w: 3.0012, b: 0.8071# Epoch [1800/2000], Loss: 0.031214, LR: 0.00387, w: 3.0012, b: 0.8071# Epoch [2000/2000], Loss: 0.031214, LR: 0.00349, w: 3.0012, b: 0.8071# ============================================================# 训练完成!# ============================================================# 真实关系: y = 3.0000x + 0.8000# 学习到的: y = 3.0012x + 0.8071# 权重误差: 0.0012# 偏置误差: 0.0071# ============================================================# 详细参数分析# ============================================================# linear.weight:#   数值: [3.0011792]#   梯度: [-2.7798116e-05]#   是否需要梯度: True# linear.bias:#   数值: [0.8071371]#   梯度: [8.128583e-06]#   是否需要梯度: True# ============================================================# 测试预测# ============================================================#       输入 x |       预测 y |       真实 y |         误差# --------------------------------------------------#       0.50 |     2.3077 |     2.3000 |     0.0077#       1.00 |     3.8083 |     3.8000 |     0.0083#       1.50 |     5.3089 |     5.3000 |     0.0089#       2.00 |     6.8095 |     6.8000 |     0.0095#       2.50 |     8.3101 |     8.3000 |     0.0101# ============================================================# 模型训练完成!# 最终损失: 0.031214# ============================================================
可视化训练过程
线性回归拟合结果

四、 核心总结:PyTorch 的“五步心法”

不管你将来写的是简单的线性回归,还是最新的 ChatGPT (Transformer) 架构,其训练核心代码永远只有这五步。请把这段代码刻在 DNA 里

# 1. 梯度清零:打扫战场,准备下一轮optimizer.zero_grad()# 2. 前向传播:模型根据输入做出预测output = model(input)# 3. 计算损失:看看预测错得有多离谱loss = loss_fn(output, target)# 4. 反向传播:把责任(梯度)分摊给每个参数loss.backward()# 5. 优化更新:参数根据梯度修正自己optimizer.step()

五、 避坑与进阶建议

  1. 1. Shape Mismatch (维度地狱)
    • • 90% 的 PyTorch 报错都是因为矩阵维度对不上。
    • • 干货技巧:在 forward 函数里,多插几句 print(x.shape),调试时极其有用。不要瞎猜,要看形状。
  2. 2. Dataset 与 DataLoader
    • • 实际项目中,数据不是一次性塞进内存的(显存会爆)。
    • • 你需要学习 torch.utils.data.DataLoader,它能帮你把数据切成小块(Batch),并在 GPU 训练的同时,利用 CPU 多进程预读取下一批数据。这是工业级训练的标配。
  3. 3. Debug 技巧
    • • 如果你发现 Loss 不下降,或者变成 NaN,先检查学习率是不是太大了,再检查数据里有没有无穷大值,最后检查是不是忘了 optimizer.zero_grad()

六、 结语:这才是 AI 的起点

恭喜你!学完这一篇,你才算真正拿到了进入 AI 殿堂的钥匙。

NumPy 让你理解了矩阵,Autograd 让你理解了学习,PyTorch 让你拥有了算力。

现在的你,已经具备了复现经典算法的能力。

下一阶段预告

我们将带着 PyTorch 这把屠龙刀,进入 【机器学习基础】。

我们不再手写 ,而是要去挑战经典的分类问题:逻辑回归、决策树、SVM。我们将看看 AI 是如何把花哨的数据分类得井井有条的。

作业:

尝试修改上面的“高阶实现”代码,把 nn.Linear(1, 1) 改成一个包含隐藏层的神经网络(比如 nn.Sequential(nn.Linear(1, 10), nn.ReLU(), nn.Linear(10, 1))),去拟合一个非线性函数(比如 )。体会一下深度学习的威力。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-09 00:44:37 HTTP/2.0 GET : https://f.mffb.com.cn/a/460887.html
  2. 运行时间 : 0.169585s [ 吞吐率:5.90req/s ] 内存消耗:4,602.29kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=d40fcd67cc5c515dd05c9a2acfcbc140
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000954s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001515s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.007241s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.009659s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000621s ]
  6. SELECT * FROM `set` [ RunTime:0.008477s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000601s ]
  8. SELECT * FROM `article` WHERE `id` = 460887 LIMIT 1 [ RunTime:0.017207s ]
  9. UPDATE `article` SET `lasttime` = 1770569077 WHERE `id` = 460887 [ RunTime:0.002162s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.006266s ]
  11. SELECT * FROM `article` WHERE `id` < 460887 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.003854s ]
  12. SELECT * FROM `article` WHERE `id` > 460887 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.004854s ]
  13. SELECT * FROM `article` WHERE `id` < 460887 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.008974s ]
  14. SELECT * FROM `article` WHERE `id` < 460887 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005679s ]
  15. SELECT * FROM `article` WHERE `id` < 460887 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.020312s ]
0.171213s