Python可以使您的代码编写得更快、更容易和更易于维护gydF4y2Ba

Python是一种功能强大的动态语言。它让程序员自定义语言,让它为他们工作,而不是把所有东西都放入语言中。gydF4y2BafastcoregydF4y2Ba使用这种灵活性添加到Python特性中,这些特性受到我们喜爱的其他语言的启发,比如Julia的多分派、Ruby的混合、以及Haskell的局部化、绑定等。它还添加了一些“缺失的特性”,并清理了Python标准库中的一些粗糙之处,比如简化并行处理,以及将NumPy的思想引入PythongydF4y2Ba列表gydF4y2Ba类型。gydF4y2Ba

安装gydF4y2Ba

要安装fastcore运行:gydF4y2Baconda安装fastcoregydF4y2Ba(如果你使用Anaconda,我们强烈建议)或gydF4y2BaPIP安装fastcoregydF4y2Ba。对于一个gydF4y2Ba编辑安装gydF4y2Ba,克隆此repo并运行:gydF4y2Bapip安装-e ".[dev]"gydF4y2Ba。gydF4y2Ba

参观gydF4y2Ba

fastcoregydF4y2Ba包含许多功能。看到gydF4y2Ba文档gydF4y2Ba对于所有的细节,它覆盖所提供的模块:gydF4y2Ba

这里(稍微)快速浏览了一些大型模块,展示了来自每个模块的示例。gydF4y2Ba

文档gydF4y2Ba

都快。人工智能项目,包括这个项目,都是用gydF4y2BanbdevgydF4y2Ba,这是一个完整的文字编程环境建立在木星的笔记本。这意味着每一份文档,包括你现在正在阅读的页面,都可以作为交互式的木星笔记本访问。事实上,你甚至可以抓住一个链接直接到一个笔记本运行互动的谷歌Colab -如果你想跟随这个旅程,点击下面的链接,或点击在页面顶端的徽章:gydF4y2Ba

colab_linkgydF4y2Ba(gydF4y2Ba“指数”gydF4y2Ba)gydF4y2Ba

完整的文档可在gydF4y2Bafastcore.fast.aigydF4y2Ba。在实例和所有fast.ai库中的代码的gydF4y2Ba快。人工智能风格指南gydF4y2Ba。以支持交互编程,一切快速。ai库被设计为允许gydF4y2Ba进口*gydF4y2Ba安全使用的安全使用的,特别是通过确保gydF4y2Ba__all__gydF4y2Ba在所有包中定义。为了查看一个函数来自哪里,只需输入:gydF4y2Ba

coll_reprgydF4y2Ba
< fastcore.foundation函数。coll_repr (c, max_n = 10) >gydF4y2Ba

有关详细信息,包括到完整文档和源代码的链接,请使用gydF4y2Ba医生gydF4y2Ba,它会弹出这个信息的窗口:gydF4y2Ba

医生gydF4y2Ba(gydF4y2Bacoll_reprgydF4y2Ba)gydF4y2Ba

该文档还包含任何相关函数或类的链接,如下所示:gydF4y2Bacoll_reprgydF4y2Ba(在笔记本上,你只会看到一个带反勾的单词;链接在文档站点中自动生成)。文档通常会展示一个或多个使用示例,以及理解它们所需的任何背景内容。正如您将看到的,每个函数和方法的示例都显示为测试,而不是示例输出,因此让我们从解释它开始。gydF4y2Ba

测试gydF4y2Ba

fastcore的测试模块的设计工作以及与gydF4y2BanbdevgydF4y2Ba,这是一个完整的文字编程环境建立在木星的笔记本。这意味着您的测试、文档和代码都放在同一个笔记本中。fastcore和nbdev的测试方法以所有测试都应该通过为前提。如果一个测试失败,就不会再运行笔记本中的测试。gydF4y2Ba

测试是这样的:gydF4y2Ba

test_eqgydF4y2Ba(gydF4y2Bacoll_reprgydF4y2Ba(gydF4y2Ba范围gydF4y2Ba(gydF4y2Ba1000gydF4y2Ba),gydF4y2Ba5gydF4y2Ba),gydF4y2Ba'(#1000)[0,1,2,3,4 ...]'gydF4y2Ba)gydF4y2Ba

这是从文档为例gydF4y2Bacoll_reprgydF4y2Ba。正如你看到的,它不是直接显示你的输出。下面是什么样子:gydF4y2Ba

coll_reprgydF4y2Ba(gydF4y2Ba范围gydF4y2Ba(gydF4y2Ba1000gydF4y2Ba),gydF4y2Ba5gydF4y2Ba)gydF4y2Ba
'(#1000)[0,1,2,3,4 ...]'gydF4y2Ba

因此,测试实际上是显示你输出的样子,因为如果函数调用没有返回gydF4y2Ba'(#1000)[0,1,2,3,4 ...]'gydF4y2Ba,则测试就失败了。gydF4y2Ba

因此,在该文档显示的每个测试也显示出你的图书馆反之亦然行为---与副!gydF4y2Ba

测试函数总是以gydF4y2Batest_gydF4y2Ba,然后进行测试操作。所以gydF4y2Batest_eqgydF4y2Ba平等的测试(如你在例子中看到上图)。这包括数组和张量,列表和发电机,以及更多的平等的测试:gydF4y2Ba

test_eqgydF4y2Ba([gydF4y2Ba0gydF4y2Ba,gydF4y2Ba1gydF4y2Ba,gydF4y2Ba2gydF4y2Ba,gydF4y2Ba3.gydF4y2Ba]gydF4y2BaNPgydF4y2Ba。gydF4y2Ba不等gydF4y2Ba(gydF4y2Ba4gydF4y2Ba))gydF4y2Ba

当测试失败时,它打印出关于预期结果的信息:gydF4y2Ba

test_eqgydF4y2Ba([gydF4y2Ba0gydF4y2Ba,gydF4y2Ba1gydF4y2Ba,gydF4y2Ba2gydF4y2Ba,gydF4y2Ba3.gydF4y2Ba]gydF4y2BaNPgydF4y2Ba。gydF4y2Ba不等gydF4y2Ba(gydF4y2Ba3.gydF4y2Ba))gydF4y2Ba
----的AssertionError:==:[0,1,2,3] [0 1 2]gydF4y2Ba

如果您想检查对象是否是相同的类型,而不是仅仅包含相同的集合,请使用gydF4y2Batest_eq_typegydF4y2Ba。gydF4y2Ba

你可以使用任何的比较功能测试gydF4y2Ba测试gydF4y2Ba,例如测试一个对象是否小于:gydF4y2Ba

测试gydF4y2Ba(gydF4y2Ba2gydF4y2Ba,gydF4y2Ba3.gydF4y2Ba,gydF4y2Ba操作符gydF4y2Ba。gydF4y2BaLTgydF4y2Ba)gydF4y2Ba

你甚至可以测试抛出异常:gydF4y2Ba

defgydF4y2Badivide_zerogydF4y2Ba():gydF4y2Ba返回gydF4y2Ba1gydF4y2Ba/gydF4y2Ba0gydF4y2Batest_failgydF4y2Ba(gydF4y2Badivide_zerogydF4y2Ba)gydF4y2Ba

…和测试that things are printed to stdout:

test_stdoutgydF4y2Ba(gydF4y2BaλgydF4y2Ba:gydF4y2Ba打印gydF4y2Ba(gydF4y2Ba“喜”gydF4y2Ba),gydF4y2Ba“喜”gydF4y2Ba)gydF4y2Ba

基金会gydF4y2Ba

快。人工智能的不同寻常之处在于我们经常使用gydF4y2BamixingydF4y2Ba在我们的代码。mixin在许多编程语言中被广泛使用,比如Ruby,但在Python中却没有这么多。我们使用mixin将新的行为附加到现有的库中,或者允许模块向我们自己的类中添加新的行为,比如在扩展模块中。我们定义的mixin的一个有用的例子是gydF4y2BaPath.lsgydF4y2Ba,它列出一个目录并返回gydF4y2BalgydF4y2Ba(我们稍后会讨论的扩展列表类):gydF4y2Ba

pgydF4y2Ba=gydF4y2Ba路径gydF4y2Ba(gydF4y2Ba'图片'gydF4y2Ba)gydF4y2BapgydF4y2Ba。gydF4y2BaLSgydF4y2Ba()gydF4y2Ba
(# 6)[路径(“图像/ att_00007.png”),路径(“图像/ att_00000.png”),路径(“图像/ puppy.jpg”),路径(“图像/ att_00006.png”),路径(“图像/ mnist3.png”),路径(图片/ att_00005.png)]gydF4y2Ba

你可以很容易地添加你自己的混合gydF4y2Ba补丁gydF4y2Ba装饰gydF4y2Ba,这需要的Python优点3gydF4y2Ba功能说明gydF4y2Ba说什么类补丁:gydF4y2Ba

@补丁gydF4y2BadefgydF4y2Banum_itemsgydF4y2Ba(gydF4y2Ba自gydF4y2Ba:gydF4y2Ba路径gydF4y2Ba):gydF4y2Ba返回gydF4y2BalengydF4y2Ba(gydF4y2Ba自gydF4y2Ba。gydF4y2BaLSgydF4y2Ba())gydF4y2BapgydF4y2Ba。gydF4y2Banum_itemsgydF4y2Ba()gydF4y2Ba
6gydF4y2Ba

我们还使用gydF4y2Ba** kwargsgydF4y2Ba频繁。在python中gydF4y2Ba** kwargsgydF4y2Ba在参数like中表示"gydF4y2Ba将任何其他关键字参数放入调用的dict中gydF4y2BakwargsgydF4y2Ba”通常情况下,使用gydF4y2BakwargsgydF4y2Ba这使得API非常难以使用,因为它破坏了像tab完成和弹出签名列表这样的功能。gydF4y2Ba跑龙套gydF4y2Ba提供了gydF4y2Bause_kwargsgydF4y2Ba和gydF4y2Ba代表gydF4y2Ba来避免这个问题。看到我们的gydF4y2Ba代表团详细文章gydF4y2Ba关于这一主题。gydF4y2Ba

GetAttrgydF4y2Ba解决了一个类似的问题(在上面链接的文章中也讨论了这个问题):它允许您使用Python的特别有用的功能gydF4y2Ba__getattr__gydF4y2Ba魔术方法,但避免了问题,通常在Python的标签完成和文档中断时使用它。例如,你可以看到这里的PythongydF4y2BadirgydF4y2Ba函数,该函数被用于找到一个python对象的属性,发现内的一切gydF4y2Baself.defaultgydF4y2Ba属性:gydF4y2Ba

类gydF4y2Ba作者gydF4y2Ba:gydF4y2BadefgydF4y2Ba__在里面__gydF4y2Ba(gydF4y2Ba自gydF4y2Ba,gydF4y2Ba的名字gydF4y2Ba):gydF4y2Ba自gydF4y2Ba。gydF4y2Ba的名字gydF4y2Ba=gydF4y2Ba的名字gydF4y2Ba类gydF4y2BaProductPagegydF4y2Ba(gydF4y2BaGetAttrgydF4y2Ba):gydF4y2Ba_默认gydF4y2Ba=gydF4y2Ba“作者”gydF4y2BadefgydF4y2Ba__在里面__gydF4y2Ba(gydF4y2Ba自gydF4y2Ba,gydF4y2Ba作者gydF4y2Ba,gydF4y2Ba价格gydF4y2Ba,gydF4y2Ba成本gydF4y2Ba):gydF4y2Ba自gydF4y2Ba。gydF4y2Ba作者gydF4y2Ba,gydF4y2Ba自gydF4y2Ba。gydF4y2Ba价格gydF4y2Ba,gydF4y2Ba自gydF4y2Ba。gydF4y2Ba成本gydF4y2Ba=gydF4y2Ba作者gydF4y2Ba,gydF4y2Ba价格gydF4y2Ba,gydF4y2Ba成本gydF4y2BapgydF4y2Ba=gydF4y2BaProductPagegydF4y2Ba(gydF4y2Ba作者gydF4y2Ba(gydF4y2Ba“杰里米”gydF4y2Ba),gydF4y2Ba1.50gydF4y2Ba,gydF4y2Ba0.50gydF4y2Ba)gydF4y2Ba(gydF4y2BaogydF4y2Ba为gydF4y2BaogydF4y2Ba在gydF4y2BadirgydF4y2Ba(gydF4y2BapgydF4y2Ba)gydF4y2Ba如果gydF4y2Ba不gydF4y2BaogydF4y2Ba。gydF4y2Ba以。。开始gydF4y2Ba(gydF4y2Ba“_”gydF4y2Ba)]gydF4y2Ba
['author', 'cost', 'name', 'price']gydF4y2Ba

望着那gydF4y2BaProductPagegydF4y2Ba例如,它相当冗长,并且重复了许多属性名称,如果只在一个地方更改它们,可能会导致稍后出现错误。gydF4y2BafastcoregydF4y2Ba提供了gydF4y2Bastore_attrgydF4y2Ba简化该共用图案。它还提供gydF4y2Babasic_reprgydF4y2Ba给简单的对象一个有用的gydF4y2BareprgydF4y2Ba:gydF4y2Ba

类gydF4y2BaProductPagegydF4y2Ba:gydF4y2BadefgydF4y2Ba__在里面__gydF4y2Ba(gydF4y2Ba自gydF4y2Ba,gydF4y2Ba作者gydF4y2Ba,gydF4y2Ba价格gydF4y2Ba,gydF4y2Ba成本gydF4y2Ba):gydF4y2Bastore_attrgydF4y2Ba()gydF4y2Ba__repr__gydF4y2Ba=gydF4y2Babasic_reprgydF4y2Ba(gydF4y2Ba作者、价格、成本的gydF4y2Ba)gydF4y2BaProductPagegydF4y2Ba(gydF4y2Ba“杰里米”gydF4y2Ba,gydF4y2Ba1.50gydF4y2Ba,gydF4y2Ba0.50gydF4y2Ba)gydF4y2Ba
ProductPage(=作者杰里米,价格= 1.5,成本= 0.5)gydF4y2Ba

其中最有趣的一个gydF4y2BafastcoregydF4y2Ba功能是gydF4y2Bafuncs_kwargsgydF4y2Ba装饰。由此,不子类进行修改类的行为。这可以让那些不熟悉面向对象发展到更轻松地自定义你的类人。下面是一类使用的例子gydF4y2Bafuncs_kwargsgydF4y2Ba:gydF4y2Ba

@funcs_kwargsgydF4y2Ba类gydF4y2BaTgydF4y2Ba:gydF4y2Ba_方法gydF4y2Ba=gydF4y2Ba(gydF4y2Ba'some_method'gydF4y2Ba]gydF4y2BadefgydF4y2Ba__在里面__gydF4y2Ba(gydF4y2Ba自gydF4y2Ba,gydF4y2Ba* *gydF4y2BakwargsgydF4y2Ba):gydF4y2Ba断言gydF4y2Ba不gydF4y2BakwargsgydF4y2Ba,gydF4y2BafgydF4y2Ba“传递未知ARGS:gydF4y2Ba{gydF4y2BakwargsgydF4y2Ba}gydF4y2Ba”gydF4y2BapgydF4y2Ba=gydF4y2BaTgydF4y2Ba(gydF4y2Basome_methodgydF4y2Ba=gydF4y2Ba打印gydF4y2Ba)gydF4y2BapgydF4y2Ba。gydF4y2Basome_methodgydF4y2Ba(gydF4y2Ba“你好”gydF4y2Ba)gydF4y2Ba
你好gydF4y2Ba

的gydF4y2Ba断言不kwargsgydF4y2Ba上面用来确保用户没有传递一个未知的参数(即一个不在中的参数)gydF4y2Ba_方法gydF4y2Ba)。gydF4y2BafastaigydF4y2Ba使用gydF4y2Bafuncs_kwargsgydF4y2Ba例如,在许多地方,您可以自定义a的任何部分gydF4y2BaDataLoadergydF4y2Ba通过将自己的方法。gydF4y2Ba

fastcoregydF4y2Ba还提供了许多实用函数,使Python程序员的工作更轻松gydF4y2Bafastcore.utilsgydF4y2Ba。我们不会在多看看这里,因为你可以轻松地查看的文档自己。让你开始,看看该文档的gydF4y2Ba分块gydF4y2Ba(记住,如果你在一个笔记本,型号是gydF4y2Ba医生(分块)gydF4y2Ba),其是用于从集合创建懒惰地产生批次一个方便的功能。gydF4y2Ba

Python的gydF4y2BaProcessPoolExecutorgydF4y2Ba已扩展为允许gydF4y2Bamax_workersgydF4y2Ba被设置为gydF4y2Ba0gydF4y2Ba,以方便关闭并行处理。这使得串行调试代码,然后并行运行代码变得很容易。它还允许您向并行函数传递参数,并确保在调用之间有一个暂停,以防您正在运行的进程有竞争条件。gydF4y2Ba平行gydF4y2Ba使并行处理更容易使用,甚至增加了一个可选的进度条。gydF4y2Ba

lgydF4y2Ba

与大多数语言一样,Python允许对一些非常常见的类型使用非常简洁的语法,例如gydF4y2Ba列表gydF4y2Ba,可构造gydF4y2Ba(1、2、3)gydF4y2Ba。Perl的设计者Larry Wall解释了这种语法的原因:gydF4y2Ba

在隐喻的荣誉霍夫曼的压缩代码分配更小的比特到更常见的字节。就语法而言,它只是意味着常用的东西应该更短,但不应该在不太常见的构造上浪费短序列。gydF4y2Ba

在此基础上,gydF4y2BafastcoregydF4y2Ba只有一种类型,只有一个字母名称:gydF4y2BalgydF4y2Ba。这样做的原因是,它被设计为替代gydF4y2Ba列表gydF4y2Ba,所以我们希望它使用起来和gydF4y2Ba(1、2、3)gydF4y2Ba。下面是如何创建一个gydF4y2BalgydF4y2Ba:gydF4y2Ba

lgydF4y2Ba(gydF4y2Ba1gydF4y2Ba,gydF4y2Ba2gydF4y2Ba,gydF4y2Ba3.gydF4y2Ba)gydF4y2Ba
(# 3)(1、2、3)gydF4y2Ba

首先要注意的是angydF4y2BalgydF4y2Ba对象包括在其表示其数目的元素;这就是gydF4y2Ba(# 3)gydF4y2Ba在上面的输出中。如果有超过10个元素,它将自动截断列表:gydF4y2Ba

pgydF4y2Ba=gydF4y2BalgydF4y2Ba。gydF4y2Ba范围gydF4y2Ba(gydF4y2Ba20.gydF4y2Ba)gydF4y2Ba。gydF4y2Ba拖曳gydF4y2Ba()gydF4y2BapgydF4y2Ba
(20 #)[10 1 18日,7日,11日,14日,3日,16日13日15…]gydF4y2Ba

lgydF4y2Ba包含许多与NumPy相同的索引思想gydF4y2Ba排列gydF4y2Ba做,包括索引索引列表,或布尔掩码列表:gydF4y2Ba

pgydF4y2Ba(gydF4y2Ba2gydF4y2Ba,gydF4y2Ba4gydF4y2Ba,gydF4y2Ba6gydF4y2Ba]gydF4y2Ba
(#3)[1,10,3]gydF4y2Ba

它还包含中使用的其他方法gydF4y2Ba排列gydF4y2Ba,如gydF4y2BaL.argwheregydF4y2Ba:gydF4y2Ba

pgydF4y2Ba。gydF4y2BaargwheregydF4y2Ba(gydF4y2Ba通用电气gydF4y2Ba(gydF4y2Ba15gydF4y2Ba))gydF4y2Ba
(#5)[0,7,9,16,17]gydF4y2Ba

正如你从这个例子中看到的,gydF4y2BafastcoregydF4y2Ba还包括许多功能,使编程更容易,的功能风格诸如全方位的布尔函数(例如gydF4y2Ba通用电气gydF4y2Ba,gydF4y2BagtgydF4y2Ba等),这给了相同的答案从Python的功能gydF4y2Ba操作符gydF4y2Ba如果给定两个参数,则返回gydF4y2Ba咖喱函数gydF4y2Ba如果给定一个参数。gydF4y2Ba

这里有太多的功能,所以一定要检查文档。许多我们认为应该加入的小事情gydF4y2Ba列表gydF4y2Ba首先,比如让它做您预期的事情(这是一个错误gydF4y2Ba列表gydF4y2Ba,但工作正常gydF4y2BalgydF4y2Ba):gydF4y2Ba

1gydF4y2Ba+gydF4y2BalgydF4y2Ba(gydF4y2Ba2gydF4y2Ba,gydF4y2Ba3.gydF4y2Ba,gydF4y2Ba4gydF4y2Ba)gydF4y2Ba
(#4)[1,2,3,4]gydF4y2Ba

函数调度和转换gydF4y2Ba

大多数Python程序员使用面向对象的方法和继承来允许不同的对象以不同的方式行为,即使在使用相同的方法名调用时也是如此。有些语言使用一种非常不同的方法,比如Julia,它使用gydF4y2Ba多调度泛型函数gydF4y2Ba。Python提供gydF4y2Ba单牒通用功能gydF4y2Ba作为标准库的一部分。gydF4y2BafastcoregydF4y2Ba提供了多种调度,与gydF4y2BatypedispatchgydF4y2Ba装饰器(这实际上是一个实例gydF4y2BaDispatchReggydF4y2Ba):gydF4y2Ba

@typedispatchgydF4y2BadefgydF4y2Ba_FgydF4y2Ba(gydF4y2BaxgydF4y2Ba:gydF4y2Ba数字gydF4y2Ba。gydF4y2Ba积分gydF4y2Ba,gydF4y2BaygydF4y2Ba):gydF4y2Ba返回gydF4y2BaxgydF4y2Ba+gydF4y2Ba1gydF4y2Ba@typedispatchgydF4y2BadefgydF4y2Ba_FgydF4y2Ba(gydF4y2BaxgydF4y2Ba:gydF4y2BaINTgydF4y2Ba,gydF4y2BaygydF4y2Ba:gydF4y2Ba浮动gydF4y2Ba):gydF4y2Ba返回gydF4y2BaxgydF4y2Ba+gydF4y2BaygydF4y2Ba_FgydF4y2Ba(gydF4y2Ba3.gydF4y2Ba,gydF4y2Ba2.0gydF4y2Ba),gydF4y2Ba_FgydF4y2Ba(gydF4y2Ba3.gydF4y2Ba,gydF4y2Ba2gydF4y2Ba)gydF4y2Ba
(5.0, 4)gydF4y2Ba

这种分派方法对于在扩展模块或用户代码中添加功能实现特别有用。它被广泛应用于gydF4y2Ba转变gydF4y2Ba类。一个gydF4y2Ba转变gydF4y2Ba是fastai数据管道的主要构建块。在最一般的术语中,转换可以是您想要应用于数据的任何函数,但是gydF4y2Ba转变gydF4y2Ba类提供了几种机制,使构建它们的过程简单而灵活(参阅文档了解关于这些的信息):gydF4y2Ba

  • 类型的调度gydF4y2Ba
  • 调度在元组gydF4y2Ba
  • ReversabilitygydF4y2Ba
  • 式传播gydF4y2Ba
  • 预处理gydF4y2Ba
  • 根据数据集类型进行过滤gydF4y2Ba
  • 订购gydF4y2Ba
  • 用decorator附加新行为gydF4y2Ba

转变gydF4y2Ba长相三个特殊的方法,gydF4y2Ba编码gydF4y2Ba,gydF4y2Ba解码gydF4y2Ba和gydF4y2Ba设置gydF4y2Ba,这为实施gydF4y2Ba__call__gydF4y2Ba,gydF4y2Ba解码gydF4y2Ba和gydF4y2Ba设置gydF4y2Ba分别。例如:gydF4y2Ba

类gydF4y2Ba一个gydF4y2Ba(gydF4y2Ba转变gydF4y2Ba):gydF4y2BadefgydF4y2Ba编码gydF4y2Ba(gydF4y2Ba自gydF4y2Ba,gydF4y2BaxgydF4y2Ba):gydF4y2Ba返回gydF4y2BaxgydF4y2Ba+gydF4y2Ba1gydF4y2Ba一个gydF4y2Ba() (gydF4y2Ba1gydF4y2Ba)gydF4y2Ba
2gydF4y2Ba

对于这样的简单转换,您还可以使用gydF4y2Ba转变gydF4y2Ba装饰:gydF4y2Ba

@转变gydF4y2BadefgydF4y2BafgydF4y2Ba(gydF4y2BaxgydF4y2Ba):gydF4y2Ba返回gydF4y2BaxgydF4y2Ba+gydF4y2Ba1gydF4y2BafgydF4y2Ba(gydF4y2Ba1gydF4y2Ba)gydF4y2Ba
2gydF4y2Ba

变换可以被组合成gydF4y2Ba管道gydF4y2Ba:gydF4y2Ba

@转变gydF4y2BadefgydF4y2BaggydF4y2Ba(gydF4y2BaxgydF4y2Ba):gydF4y2Ba返回gydF4y2BaxgydF4y2Ba/gydF4y2Ba2gydF4y2Ba管gydF4y2Ba=gydF4y2Ba管道gydF4y2Ba([gydF4y2BafgydF4y2Ba,gydF4y2BaggydF4y2Ba])gydF4y2Ba管gydF4y2Ba(gydF4y2Ba3.gydF4y2Ba)gydF4y2Ba
2.0gydF4y2Ba

的力量gydF4y2Ba转变gydF4y2Ba和gydF4y2Ba管道gydF4y2Ba通过查看它们如何用于创建完整的数据处理管道,可以更好地理解它们。这在gydF4y2Ba第十一章gydF4y2Ba的gydF4y2Bafastai书gydF4y2Ba,这是gydF4y2Ba免费gydF4y2Ba以木星笔记本格式。gydF4y2Ba

特约gydF4y2Ba

当你克隆这个仓库,请运行gydF4y2Banbdev_install_git_hooksgydF4y2Ba在你的终端。这就建立了git钩子,用来清理笔记本,删除笔记本中存储的不必要的东西(比如你运行的单元),这些东西会导致不必要的合并冲突。gydF4y2Ba

要并行运行,发射测试gydF4y2Banbdev_test_nbsgydF4y2Ba要么gydF4y2Ba化妆测试gydF4y2Ba。gydF4y2Ba

在提交公共关系之前,检查当地的图书馆和笔记本是否匹配。这个脚本gydF4y2Banbdev_diff_nbsgydF4y2Ba可以让你知道当地图书馆和笔记本之间是否有区别。gydF4y2Ba

  • 如果对导出单元格中的一个笔记本进行了更改,则可以将其导出到库中gydF4y2Banbdev_build_libgydF4y2Ba要么gydF4y2Ba使fastcoregydF4y2Ba。gydF4y2Ba
  • 如果您对库做了更改,您可以将其导出回笔记本gydF4y2Banbdev_update_libgydF4y2Ba。gydF4y2Ba