V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
marin11
V2EX  ›  程序员

一些关于 Python 编程的疑惑

  •  
  •   marin11 · 315 天前 · 1992 次点击
    这是一个创建于 315 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我现在编写 python 程序时,基本上都是在使用.ipynb 而不是.py
    但是我依赖.ipynb 的主要原因是 ipynb 可以创建单元格允许我只运行一部分代码,
    而不是他提供的交互性(比如直接显示图片和输出结果之类的)
    所以让我感觉有点违和感。。。

    具体来说 ipynb 可以允许我只运行一部分代码,即使报了 BUG ,
    我也知道只是我最近写的一个单元格里的代码出问题了,而不是之前的某一部分代码出了问题。
    但是其他编程语言中并没有 ipynb 这个文件格式,我在在想他们 debug 应该都是怎么做的?
    这是不是因为我不会断点调试而导致我依赖 ipynb

    举一个具体的例子:
    我从原文件提取了很多特征量,用来作为模型的输入,之后我会定义一个 Model 来训练。
    如果使用 ipynb ,我可以在一个单元格里提取了这些特征量,然后在下一个单元格里定义 model ,即使 model 定义错了(比如模型输入 size 和特征量 size 不符),我也可以直接在第二个单元格里修改,而不用从头开始执行特征提取这一步。
    但是用.py 就要从头开始执行,又要浪费时间提取一遍特征量就很麻烦。。
    19 条回复    2023-06-08 15:11:26 +08:00
    shinsekai
        1
    shinsekai  
       315 天前
    matlab 的话可以用 mlx 实时脚本或者使用%%分段运行
    Alias4ck
        2
    Alias4ck  
       315 天前
    可是你工程化的时候就不能这么做了啊
    thinkershare
        3
    thinkershare  
       315 天前
    基本的不需要 Debug, Debug 也是跑 UnitTest/Log/端点单步调试, 任何工程性质的项目都不会使用 ipynb 这种模式,这个模式只是提供给交互场景这种及其有限情况下使用的。
    eagleoflqj
        4
    eagleoflqj  
       315 天前
    ipynb 就是用来干这个的,其他语言要么也有这种功能(比如 mathematica ),要么压根不适合做数据处理
    当你用 python 做别的,比如写 django 后端,自然就不用 ipynb 了
    lithiumii
        5
    lithiumii  
       315 天前 via Android   ❤️ 2
    因为你在做的事情是探索性、实验性的,人为介入是流程的一部分,最终成果不一定是代码而是某个问题的答案,所以写一段跑一段改一段很方便。MATLAB 和 R 的用户也是这样。

    写工程代码的人,交付的是代码,代码要在无人介入的情况下跑千遍万遍无数遍。在代码能这样跑起来之前,也有逐步运行或者分割运行的情况,可以靠 debugger 或者自动重载的调试模式、单元测试、打日志、反复运行看结果等等。

    此外,其实 Jupyter 可以跑很多很多语言,名字里就有仨( Julia 、Py 、R ),此外什么 C 啊 C++ 啊 JS 啊等等都有。
    geekdonie
        6
    geekdonie  
       315 天前
    有需求,使用合适的解决方案,没什么可疑惑的
    zhzy
        7
    zhzy  
       315 天前 via iPhone
    支持 rrpl 的语言都可以吧,只是可能没有一个像 ipynb 那样具体的文件
    zhzy
        8
    zhzy  
       315 天前 via iPhone
    @zhzy repl 打错了
    pcbl
        9
    pcbl  
       315 天前 via Android
    只能说羡慕楼主工作中可以写这种各部分关联性不强的代码。我这边生产用到的代码已经是面条状态了,想单独调试运行一部分那是不可能的。
    dayeye2006199
        10
    dayeye2006199  
       315 天前
    LZ 你需要的就是 literate programming 。边写程序边研究下面怎么干。

    如果你想写出比较健壮的代码,可以采用测试驱动编程。

    比如先写特征处理的代码,然后把形状、结果的数字什么的编写到测试里。然后再去做代码实现。
    跑测试的时候,可以整个测试数据集,数量小一些,可以比较快的得到结果。
    Contextualist
        11
    Contextualist  
       315 天前
    越过现象看本质:无论什么领域的代码、无论多大规模的项目,维护靠的都是模块化,即把一个项目拆分成尽量相互独立的部分,以便管理维护。

    对于一个 .ipynb 文件,单元格就是一种模块化。而一个组织良好的 Python 项目并不会是单个 .py 文件,而是会包含许多相互依赖的 .py 文件和文件夹,它们构成了 Python 模块化中的包( package )和模组( module )。

    以 debug 举例,一个 Python 项目中,一个 .py 文件实现一个具体的功能,与之对应的一个单元测试文件针对性验证这个 .py 文件的功能。所以很多时候 debug 并不用运行整个项目,而是单独运行查验一个单元测试文件。

    最后多讲两句,.ipynb 是快速验证想法或者做小 demo 的利器。但如果一个项目持续增长到一定规模,最终还是整理成一个 Python 的包更有利于长期维护,因为线性组织的 .ipynb 很难维护多层的依赖关系,而且版本控制也比较困难。再说你写成一个包也是可以在 .ipynb 里导入使用的。
    shinession
        12
    shinession  
       315 天前
    python 据说就是 jupyter notebook 火起来之后位列第一的, 对新手非常友好, 适合入门, 可以一步一步的得到想要的结果, 但是对大佬来说这功能可有可无
    silkriver
        13
    silkriver  
       315 天前
    vscode 也支持只运行.py 中的一部分代码,当然直接 vscode 运行.ipynb 更方便
    uni
        14
    uni  
       315 天前
    这就是做草稿嘛,我也经常这么做(你们 py 工程师都是靠试的吗.jpg
    我用的 vscode 的# %%,感觉比 jupyter 方便很多
    ruanimal
        15
    ruanimal  
       315 天前
    @uni 我们炼丹工程师是这样的
    smallsung
        16
    smallsung  
       314 天前
    感觉特征向量提取后可以存到硬盘上,没必要每次运行都重新提取一次吧,还挺耗时间的。
    InvincibleDream
        17
    InvincibleDream  
       314 天前
    ipynb 相当于记事本,py 相当于扳手或者齿轮。记事本是用来读的,扳手或者齿轮是用来操作或者作为机器本身工作的。
    cordea
        18
    cordea  
       314 天前
    类似.ipynb 的这种东西并不是 python 独有,支持 repl 的语言都能做到类似的事,像 commonlisp 这种语言甚至就是鼓励你用 repl 来写到哪里执行到哪里。

    再说 debug ,debug 是一种最后的手段,在理想情况下,潜在的错误应该在执行程序前就被发现。而找到程序执行结果与期望不一致的原因并不一定要通过“实际去运行程序”来完成。类似于 haskll ,idris 这样的语言,能够在类型层面确保程序的一致性,使用这样的语言很少需要依赖 debug 这种最后的手段。

    以楼主的例子来说,模型输入 size 和特征量 size 不符,如果编程语言支持依赖类型之类的高级特性,会直接在运行前就提示你类型不符,就像往一个只接受 int 的函数里传入 string 一样。

    而对于更一般的语言,比如 cpp ,由于设计上的取舍,类型系统的缺陷等等,则不得不依赖 debug 或者程序员的经验来找出错误。
    marin11
        19
    marin11  
    OP
       314 天前
    @pcbl 我其实也很想有这种能处理大量相互依赖的代码的能力,但我现在不知道怎么培养。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5607 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:14 · PVG 11:14 · LAX 20:14 · JFK 23:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.