Nodejs 应用编译构建提速建议

编译构建的整体过程

  1. 拉取编译镜像

  2. 拉取缓存镜像

  3. 拉取项目源码

  4. 挂载缓存目录

  5. 执行编译命令(用户自定义)

  6. 持久化缓存

  7. 上传编译镜像

为什么在本地构建就快, 但编译机上很慢

在编辑机上每次的构建环境都是全新的, 完成一次构建比本地需要多一些步骤:

  1. 现成的全局包缓存 VS 重新构建缓存: 咱可以先简单理解为咱使用 npm 的时候那个全局的缓存目录, 编辑机需要准备持久化的缓存的环境, 包括下载、挂载以重建缓存, 如果缓存内容过大, 时间也会相对更长, 本地构建直接使用了稳定的本地文件系统;

  2. 增量安装依赖 VS 全量安装依赖: 本地不太经常需要执行 install 的过程, 即使需要, 也因为有持久的 node_modules 目录存在, 不需要全量安装, 但编辑机环境每次需要重新安装这个项目需要的所有依赖;

  3. 增量构建 VS 全量构建: 本地构建默认会将构建缓存放到 node_modules 目录下, 第二次构建的时候这些构建就能被用起来, 使得后面的构建更快, 但这个构建的默认缓存位置在编辑机上不会被持久化, 也就是每次需要全量构建.

  4. 网络环境: 有些依赖包安装依赖外部网络甚至海外网络, 本地的网络环境比较顺畅, 但编辑机的网络对与海外网的访问没有保证.

  5. 难以利用的优势: 多核大内存, nodejs项目的构建, 大部分工作都在一个线程上执行了, 不好直接利用编译机的多核优势

  6. 额外的步骤: 编译机需要下载镜像、制作并上传运行镜像、缓存内容持久化, 而本地一般只是产出包.

所以从以上角度入手, 我们可以基于这样的一些思路进行构建速度的优化:

  1. 优化镜像大小;

  2. 善用持久化缓存实现增量构建(编辑机会对 /cache/ 目录下的内容进行持久缓存)

  3. 充分利用多核优势:

    比如 ts-loader 的类型校验就可以通过其它插件在单独的线程执行, eslint-loader 也支持多线程(但目前有bug, 不建议使用).

    再比如我们可以对项目的各功能模块解耦, 拆成多个构建同时进行。

  4. 减少不必要的构建:

    比如合理配置 exclude 以精简构建文件范围;

    对于不常变动的文件, 拆出来一次构建, 下次复用.

  5. 判断是否可能有其它方式去掉对外网依赖的包

如何分析构建速度

  1. 检查 /cache/ 目录大小:
  2. 在编译命令中加入:du -sh /cache, 通过构建日志查看目录大小
  3. 在整体编译命令前后都加上date, 可以看自己项目的构建过程耗时, 即编译命令执行时间
  4. 在主要的编译命令的每一行前面加上time, eg:time npm install可以看 install 过程的实际耗时, build 过程同理.
  5. 对比整体构建时间(网页上直接显示的任务时间)与编译命令执行时间(末尾的 date 时间 - 开头的 date 时间), 如果整体时间超过编译命令执行时间很多(> 1min30s), 可能是 /cache/ 目录或镜像过大导致的。

以下为详情介绍:

使用更小的运行镜像

如果有较大的镜像, 建议联系运维进行优化.

善用持久缓存

缓存可以对应用构建带来提速的效果, 但如果缓存目录持续增长, 大到一定程度反倒可能让速度变慢.

了解缓存机制:

1. 缓存目录: /cache/

2. 默认行为: 对于 nodejs 的应用, 目前持久缓存会为 npm, pnpm 提供安装包的缓存, 以加快 npm install / pnpm install 的过程

3. 工作原理: 

    3.1 /cache/ 目录下的内容会构建成功后自动上传到服务器进行存储, 并在下次构建任务执行前进行挂载

    3.2 /cache/ 与 当前工作目录(即 './', 拉取的源码存放位置) 不在同一个文件系统(相当于是缓存在C盘而源码在D盘), pnpm install的行为将从 hark link回退为文件复制(硬链接的方式相对于大量小文件的拷贝, 速度要快很多)

    3.3 /cache/ 的工作涉及上传、下载过程, 如果过大也将会影响整个构建过程的速度

排除全局缓存对构建速度的影响

检查 /cache/ 的大小, 可以在编译命令中加入:du -sh /cache, 查看日志, 如果文件夹超过 1G(仅供参考), 建议咚咚联系行云部署(j-one)对应用缓存进行清理

解决缓存跨盘造成的性能损失

主要思路: 使源码与 /cache/ 处于同一个文件系统. 目前对于 pnpm 的应用推荐该方式.

原理: 使源码与 /cache/ 处于同一个文件系统, 这可以让 pnpm 的 hard link 方式生效, 相对于node_modules那些数以万计的小文件复制, 执行效率会得到可观的提升. 参考:Pnpm 是否可以跨多个驱动器或文件系统工作?

方式: 将当前工作目录的代码复制到 /cache/ 下再执行 install、build 命令.

参考命令:

    # 记下当前工作目录
    CUR_WORKSPACE=`pwd`
    # 存放源码
    # 咱统一用 /cache/source 放源码就好, 虽然也可以改成其它目录的名字
    mkdir -p /cache/source
    # 拷贝当前目录的代码, 到 /cache/source 下
    rsync -r ./ /cache/source --exclude=node_modules --exclude=.git
    # 切换 workspace
    cd  /cache/source
    ########## 这里替换成自己需要的内容  ###########
    # 执行 install
    pnpm i
    # 执行 build
    pnpm run build
    ########## 这里替换成自己需要的内容  ###########

    # 将构建结果拷贝到抽包地址
    ########## 如果不是 dist, 请根据需要换成其它目录, 就是你项目构建完生成的目标代码目录
    cp -r ./dist/* ${CUR_WORKSPACE}/.build
    # 删除不需要被缓存的文件
    cd ../ && rm -rf /cache/source

以上编译命令基于行云部署前端项目本身精简
请大家在理解原理、思路的基础上根据自身需要修改.

缓存构建结果

webpack 及其插件, 会对构建结果进行缓存. 我们可以利用 /cache/ 的持久化缓存来实现代码构建缓存. 其它构建工具也可以参考相关文档进行配置.

如果使用 webpack4 或依赖webpack4 的构建工具, 比如 @vue/cli-service 等, 通常会使用 cache-loader 对构建结果进行缓存, babel-loader 也会有自己的构建缓存, 但默认都放在 node_modules/.cache 目录下, 建议参考相关文档将 cache 目录设置为 /cache/build (或者其它 /cache/ 的子目录)

对于 webpack5, 自己就已经集成了 cache 功能, 可以删掉 cache-loader 等插件, 减少不必要的工作. 参考:webpack cache

如果是 monorepo 的应用, 还可以实现子项目级别的缓存, 比如使用nx进行monorepo 的管理, 则可以配置 NX_CACHE_DIRECTORY 来设置缓存地址, eg:

export NX_CACHE_DIRECTORY=/cache/jdos3-console-ui/.nx

eslint 也是一个很费时的操作, 它也支持缓存, 但默认不开启, 如果有需要也可以开启缓存, 但缓存策略需要使用 'content', 因为每次构建文件的 createTime 都会改变, metadata 的策略会失灵. 参考:eslint cache

通常我们需要同时兼容本地开发和行云部署的构建, 可以通过环境变量的方式实现, 以 webpack5 为例:

webpack5 的缓存配置:

{
    cache: {
        type: 'filesystem',
        profile: true,
        cacheDirectory: process.env.BUILD_CACHE_DIRECTORY,
        compression: 'gzip',
    },
}

同时在行云部署的编译命令中增加:

export BUILD_CACHE_DIRECTORY=/cache/.webpack

另一种利用缓存的思路: 缓存 node_modules

(编译团队提出了这种思路, 我目前没有进行相关尝试, 产品上针对该思路的通用解决方案在探索中)
主要思路: 模拟本地构建(本地构建会持久保留 node_modules目录)
收益:
1. 加速 install 的过程, 减少包的安装.
2. 利用代码构建缓存: webpack5 或 babel-loader 等一般会在 node_modules/.cache目录下存放构建缓存, 这也是很多应用本地构建较快的原因. 当然 .cache 目录会持续增长, 需要定时清理, 有兴趣大家可以看看本地的代码里是否有这个目录, 占多大空间.

参考命令:
大体上与上面 '解决缓存跨盘造成的性能损失' 过程相同, 只是最后rm 的过程保留 node_modules 目录, 以供下次使用

    ####### 与上面 解决缓存跨盘造成的性能损失 一致 #########
    # 记下当前工作目录
    CUR_WORKSPACE=`pwd`
    # 存放源码
    mkdir -p /cache/source
    # 拷贝当前目录代码到 /cache/ 下
    rsync -r ./ /cache/source --exclude=node_modules --exclude=.git
    # 切换 workspace
    cd  /cache/source
    # 执行 install
    npm i
    # 执行 build
    npm run build
    # 将构建结果拷贝到抽包地址
    cp -r ./dist/* ${CUR_WORKSPACE}/.build
    
    ####### 差异: 删除时排除 node_modules 目录 #########
    # 删除不需要被缓存的文件
    ls -A | grep -vE "^\.$|^\.\.$|^node_modules"|xargs rm -rf

减少源码

避免在 coding 中提交 node_modules 以及各种大的二进制文件

优化编译过程

优化依赖包安装的过程

  1. 有些项目依赖了 image-minimizer-webpack-plugin, 这是一个用于压缩图片的工具, 该资源依赖的 cwebp-bin 等资源需要从海外的网站下载, 这个过程可能会很慢甚至失败. 如果可能, 建议直接提交压缩后的图片到代码库, 同时去掉对这个插件的引用.
  2. 可以在编译命令前加上 time, 比如time pnpm install来观察这一步骤的耗时, 如果这一步骤很长, 可以看是否有可以去掉的依赖包, 或者禁用对可选依赖包的安装, 有时候升级构建工具也能使包依赖得到优化.

优化构建过程

  1. 对于webpack构建的应用, 对 rules、plugin(如果支持) 检查是否正确设置了 exclude, 用以减少不必要的文件构建
  2. 启用构建缓存(但缓存的持续增长还是需要关注, 缓存过大的问题后续可能从产品层面得以优化)
  3. ts-loader 通常可以开启 transpileOnly: true, 并通过fork-ts-checker-webpack-plugin进行类型检查
  4. eslint的优化, 可以对规则进行优化, 有些校验规则是非常耗时的, 但同时受益并不是很大, 可以考虑关闭. 具体可以这么做:

4.1 设置 __TIMING__环境变量, 可以启用对每个 eslint rule 的性能分析,export TIMING = 1;
4.2 在本地正常执行构建, 检测 eslint rule performance 的输出, 分析耗时较长的规则, 确认是否必要

补充:

  • 关于eslint的多线程问题: 对eslint开启多线程之后会导致 build 过程发现的规则异常不能抛出, 导致规则实际会失效. 该问题参考Issue, 这个问题挺久了, 一直没有得到有效解决.
  • 同时也可以考虑将 eslint 的校验作为 git hook 执行, 避免提交不规范的代码, 此时在 build 过程可以省略这一步骤.

5.代码 minify 的过程, 推荐使用 esbuild, 在webpack里面就可以配置.

{
   optimization: {
       minimize: true,
       minimizer: [
           new TerserPlugin({
               minify: TerserPlugin.esbuildMinify,
           }),
       ],
   }
}

6.对于不经常变动的部分, 建议提前编译, 或通过DllPlugin进行优化. 比如行云部署项目本身依赖 monaco editor, 但每次对它的源码进行构建很耗时, 所以直接将提前编译好的代码提交了, 后续直接用.

7.注意避免一个项目被 build 多次, 比如:
7.1 对于使用 vue-cli-service 的应用, v5.0.0-beta.0 开始, 可能会根据浏览器列表配置生成不同的包, 会导致多次构建
7.2 有一些项目需要微前端接入, 可能会为独立运行时、子应用模式采用不同的入口, 从而构建两次. 比如JModule的用户, 由于极早期 webpack-jmodule-plugin 的版本不能自定义入口文件, 通常会构建两次, 建议升级为最新的 @jmodule/plugin-webpack, 并且采用同一个入口文件构建一次.

8.如果是一个相对简单的应用, 可以考虑换其它构建工具, 比如 esbuild、swc, 编程语言带来的性能差异, 确实能形成降维打击.

9.如果可能, 分析项目代码间的依赖, 拆分为多个构建并行执行, 编译机的最大优势就是多核, 咱可以充分利用.

10.升级webpack以及其它构建插件, 通常也能带来一定程度的速度提升, 我们 jci 项目的编译就从升级中获得了一些受益.

补充:

  1. webpack 的更多细节优化, 可以参考http://webpack.docschina.org/configuration/cache/
  2. 同样这里也可以考虑在 build 命令前加 time, 比如time npm run build, 便于观察这一步的时间.
  3. 还可以用 ‘speed-measure-webpack-plugin’ 对 webpack 的构建时长进行辅助分析.

前端构建的提速是一项比较复杂且细节的工程, 目前产品上在持续跟踪构建慢的应用, 努力优化编译速度, 但前端本身拥有一个比较自由的技术环境, 没有统一的构建工具与流程, 另外语言本身的执行效率、单线程的构建也不好让编译机发挥其最大能力, 所以目前全局的通用优化手段还是会比较局限, 还是依赖项目自身的优化. 希望大家一起努力共建美好的明天.

作者:京东科技 林光辉

内容来源:京东云开发者社区

本文转载于网络 如有侵权请联系删除

相关文章

  • 关于深度学习中的Precision和Recall的一些理解

    precision和recall。这是论文中经常提及的两个概念。我们举这样的一个例子: 我们现在有一个检测狗的任务,但是这个任务数据中包含了猫。那么我们这个时候就有一个问题,我们怎么描述一个物体被检测出来呢?为此,我们引入了IOU这个概念?我们规定IOU>0.5表示物体被检测出来,否则没有。 现在我们有了这个指标,我们开始跑数据。假设我们已经把网络训练好了,接着找来一张图片测试(这张图片上有四个狗和三只猫),测试结果这样的(我们的目标是找图片中的狗)标注的数字表示IOU值,我们只选择IOU>0.5的物体。那么,这个时候问题又出现了,我们怎么描述我们检测的结果怎么样呢?这个时候就出现了precision和recall。我们先不急着说明这两个概念是什么,我们先看上面的结果,我们发现,我们要找的目标是狗,结果查找的目标中有猫,这显然不是我们希望看到的。我们希望通过一个指标去描述这个问题,所以我们提出了precision,precision是描述查找一个目标的精准率。我们还发现一个问题,就是我们漏找了,明明右上角是一只狗,结果没有找出来,为了表述这个问题,所以我们提出recall,

  • delete后加limit是个好习惯么

    在业务场景要求高的数据库中,对于单条删除和更新操作,在delete和update后面加limit1绝对是个好习惯。比如,在删除执行中,第一条就命中了删除行,如果SQL中有limit1;这时就return了,否则还会执行完全表扫描才return。效率不言而喻。那么,在日常执行delete时,我们是否需要养成加limit的习惯呢?是不是一个好习惯呢?在日常的SQL编写中,你写delete语句时是否用到过以下SQL?deletefromtwheresex=1limit100;复制你或许没有用过,在一般场景下,我们对delete后是否需要加limit的问题很陌生,也不知有多大区别,今天带你来了解一下,记得mark!写在前面,如果是清空表数据建议直接用truncate,效率上truncate远高于delete,应为truncate不走事务,不会锁表,也不会生产大量日志写入日志文件;truncatetabletable_name后立刻释放磁盘空间,并重置auto_increment的值。delete删除不释放磁盘空间,但后续insert会覆盖在之前删除的数据上。详细了解:https://blog.

  • 老板让我从几百个Excel中查找数据,我用Python一分钟搞定!

    本文含3251字,2图表截屏 建议阅读7分钟大家好,又到了Python办公自动化系列。今天分享一个真实的办公自动化需求,大家一定要仔细阅读需求说明,在理解需求之后即可体会Python的强大!一、需求说明首先我们来看下今天的需求,有一份档案记录总表的Excel工作簿,每天会根据当天日期建立新表,每天的表格内包含所有档案信息,同时也有可能会添加新的档案名。同个年度的总表在年末可能会有两、三百个工作表,同时每个表中可能也存在千余份档案信息。表格形式如下(为了直观呈现本例以7个工作表和十余份档案的形式呈现)需要完成的操作:为了方便审查特定档案信息,需要给出档案名后生成一份新表,该表包含指定档案在所有日期(即所有工作表)中的记录。最终结果如下(以档案x003为例):也就是老板说:给我把这几百个表格中所有包含档案x003的相关数据全部找到并整理个新的表格给我!二、步骤分析正式写代码前可以把需求分析清楚,将复杂问题简单化。说白了,这个需求要求把所有日期工作表中的特定行都提取出来整合成一个新表。那么我们可以遍历每一张表,然后遍历第一列(名称列,也可以看作A列)每一个有数据的单元格,如果单元格中的文字为

  • Spring 注解开发之 @Conditional

    这次介绍一下Spring中的一个重要的注解@Conditional。本文的组织结构如下:先看一下该注解的作用是什么;再总览这些注解有哪些属性值;最后讲解一下重要的属性值。Spring版本5.1.2.RELEASE 一、注解的作用在SpringBoot中经常看到该注解及其衍生注解,它的作用是根据条件注入组件。这里我们先创建出两个Bean作为例子:@Bean("bill") @Conditional({WindowsCondition.class}) publicPersonperson2(){ returnnewPerson("比尔盖茨",60); } @Bean("linus") @Conditional({LinuxCondition.class}) publicPersonperson3(){ returnnewPerson("李纳斯",50); }复制这段代码的意思是:如果当前操作系统是Windows就将比尔盖茨放入容器中,如果是Linux就将李纳斯放入容器中。ApplicationContextco

  • 腾讯云优惠,自己动手搭建网盘

    作为互联网时代的产物之一,网盘成功取代了U盘、硬盘,成为了大家日常生活中必不可少的工具之一;不过因为各方面的原因,网盘服务也在2016年迎来了一波关停潮,而近日,华硕网盘也传出了即将停止服务的消息。 时至今日,供大家选择的网盘服务可谓屈指可数,除了花钱使用付费网盘外,搭建私有云拥有一个属于自己的个人网盘也是一个不错的选择。不过对于普通用户来说,如何搭建个人网盘便成为了大家最关心的问题;近期,在腾讯云·开发者实验室上线的90余个项目中,小编便找到了帮助大家逐步搭建个人网盘的实验项目;活动地址:https://cloud.tencent.com/developer/labs?fromSource=gwzcw.766810.766810.766810不过对于想要完成搭建并长期使用的朋友们来说,腾讯云也同时上线了多重优惠福利供大家选择;其中,云+校园扶持计划中,学生优惠套餐低至10元/月;活动地址:https://cloud.tencent.com/act/campus?fromSource=gwzcw.766811.766811.766811想要尝试实验并且有搭建个人网盘想法的朋友们不妨前往

  • 广告小程序后端开发

    1.在微信支付后台配置apikey1.微信支付商户接入文档地址:https://pay.weixin.qq.com/wiki/doc/api/index.html复制2.微信支付对接小程序的API文档地址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1复制3.设置key:1.key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置2.输入32位数字和大小写字母的组合,设置为apikey(密钥)在apps/utils目录下新建key.py:STR=[chr(i)foriinrange(65,91)] print(STR) #65-91对应字符A-Z #['A','B','C','D','E','F','G','H','I','J',&#

  • 经理做教练,团队共卓越

    前言 我们作为普通管理者,往往在识人,选人,用人,留人上面有非常多的困惑,下面我们将通过教练六篇来深入讲解。一、人才篇 在我们真正用人的时候,需要明白人才的重要性才能用好人。《史记.高祖本纪》:夫运筹帷帐之中,决胜千里之外,吾不如子房。镇国家,抚百姓,给馈饷,不绝粮道,吾不如萧何。连百万之军,战必胜,攻必取,吾不如韩信。此三者,皆人杰也,吾能用之,此吾所以取天下也。项羽有一范曾而不能用,此其所以为我擒也。 如果将企业的经营看成是衣服的纽扣,人才则是第一粒纽扣。二、用人篇 用人有道,则人才济济,人尽其才; 有人无谋,则尽无可用之人,或是无人可用。管理者用人六法:须以品德为先合适的人放在合适的位子上扬长而避短,发挥人才的长处用人也要疑,疑人也要用勿求全责备用人不论资级注:我们重点解释下第四条,通常的说法是用人不疑,疑人不用!这是对古代和以前说的,在当今社会中员工对企业的忠诚度实际是比较低的,当我们完全把一件重要的事交给某个员工的话,一旦其离职将给项目后续可持续发展带来影响,所以演变出来备份机制和结对编程等模型,另一点是我们作为管理者在员工工作的过程中必须要时刻把控进度,不可盲目自信彻底放手

  • 小白博客 sqlmap之POST登陆框注入方式二【自动搜索表单的方式】

    sqlmap.py-u"http://192.168.160.1/sqltest/post.php"--forms它会有几次消息提示: doyouwanttotestthisform?[Y/n/q] 要测试此表单吗?[Y/n/q]  输入"Y" doyouwanttofillblankfieldswithrandomvalues?[Y/n] 是否要填充带有随机值的空白字段?[Y/n]  输入"Y" itlooksliketheback-endDBMSis'MySQL'.DoyouwanttoskiptestpayloadsspecificforotherDBMSes?[Y/n] 它看起来像后端DBMS是'MySQL'。是否要跳过特定于其他DBMS的测试负载?[Y/n] 输入"Y" fortheremainingtests,doyouwanttoincludealltestsfor'MySQL'extendingprovidedlevel(1)an

  • dedecms还原数据时要选对备份目录 不然会提示function文件出错

      小李子最近在学习dedecms,在网上下载了一个二次开发的系统,顺利安装后想要还原一下作者的备份数据,可一直没有成功,让ytkah查看一下什么情况。进到后台,点击还原,提示/e/class/function.php某段代码没有定义,打开ftp查看了那个文件的修改时间和其他文件的修改时间一样,查看了那段代码也没有修改过的痕迹,那应该是其他方面的问题。是不是备份目录没选对呢?  打开系统-系统基本参数-核心设置,默认是backupdata,  但是ftp打开发现data目录下的backupdata被改名了,加了一个前缀,难怪会出现错误,所以我们在迁移网站的时候一定要注意数据备份目录要和实际的目录一致。  附dedecms数据备份还原教程  系统-数据库备份/还原  1.dedecms数据备份  这里可以全选或选择部分表进行备份,指定备份数据格式我们一般为默认,分卷大小一般为2048,备份表结构信息默认打勾,如只需要备份数据时,可以不选择。我们点击提交按钮。备份完成后会提示“完成所有数据备份”!  2.dedecms数据还原  进入到数据还原页面后,系统会自动去找/data/backup

  • linux下追查线上问题常用命令

    linux下追查线上问题常用命令(1)查占用cpu最多的进程方法一:核心指令:ps实际命令:psH-eopid,pcpu|sort-nk2|tail执行效果如下:[work@test01~]$psH-eopid,pcpu|sort-nk2|tail313960.6313960.6313960.6313960.6313960.6313960.6313960.6313960.6309041.0309141.0结果:瞧见了吧,最耗cpu的pid=30914(实际上是31396)方法二:核心指令:top实际命令:topShift+t(2)在(1)的基础上,对应的服务名是什么呢方法一:核心指令:ps实际命令:psaux|fgreppid执行效果如下:[work@test01~]$psaux|fgrep30914work309141.00.830956871668?SlFeb02124:44./router2–conf=rs.conf结果:瞧见了吧,进程是./router2方法二:核心指令:…无,直接查proc实际命令:ll/proc/pid执行效果如下:[work@test01~]$ll/pro

  • AI入门工具篇-Tensorflow安装

    还记得去年大火大热的AlphaGo吗?从2015年开始,AlphaGo这名“网络棋手”先后挑战了欧洲围棋冠军、世界围棋冠军,几战成名后,吸引了大量的关注。而它背后的推动力正是Tensorflow,一个Google于2015年11月开源的用于制作AlphaGo的机器学习及深度学习框架。想了解AI,加入AI行列,那么我们先从最基础的工具开始吧。本文抛砖引玉,主要讲解Tensorflow的安装。在Linux系统下Tensorflow安装一般选择Linux系统来运行Tensorflow。虽然在windows上可以使用Docker运行,但是小问题很多。对Tensorflow支持最好的还是基于unix内核的系统。所以先把虚拟机装起来吧。Tensorflow支持多种前端语言,但对Python的支持是最好的,Ubuntu自带了Python,所以一般不用烦心安装事宜。安装PIPUbuntu/Linux64-bitTerminal里输入$sudoapt-getinstallpython-pippython-dev苹果MacOSX安装pip命令$sudoeasy_installpippython-pip和p

  • 小兴逛Google I/O 2017(day3实况)

    作者介绍:陈志兴,GoogleI/O2017大会的小时光茶社特派员,腾讯SNG增值产品部内容中心Android组leader,主要负责手Q个性化业务、手QWebView等项目。喜欢阅读优秀的开源项目,听听音乐,偶尔也会打打竞技类游戏。悄然而至今天是GoogleI/O2017开发者大会的第三天,也是本次开发者大会的最后一天。早上跟同事丁教授来到会场准备停车的时候,发现Google把停车位置从之前的大空地转到不远处的大草地上了。停好车后,我们绕了一条小路快速向会场方向走去,突然发现路边有很多开了花的树,样子非常像椰菜花。不知道是之前没关注到,还是突然开的花,有一种悄然而至的感觉,就像AI一样。作为会议的最后一天,主题会议场次相对较少。我从早上08:30开始到下午大会结束,一共参加了7场分享,下面给大家整理今天的精彩内容。08:30-09:30AndroidmeetsTensorFlow今天早上的第一场主题还是跟TensorFlow相关,主要介绍如何在Android终端上面使用TensorFlow,让Android终端本地可以具有机器学习的能力。跟其他TensorFlow的主题类似,演讲者给

  • 优思学院-CLMP|什么是精益生产?

    什么是精益生产?精益生产的核心理念是在最大限度地提高客户价值的同时,减少浪费。简单来说,精益就是用更少的资源为客户创造更多的价值。在精益的思想中,价值可以概括为客户愿意为之付费的所有东西 Thedefinitionofvalueinleaniseverythingthecustomeriswillingtotopayfor.精益组织要先了解客户心目中的价值,并聚焦其关键流程,不断提升客户价值。最终目标是通过完美的价值流创造过程,为客户提供完美的产品和服务,实现零浪费。为了实现这一目标,精益思想将管理的重点从优化独立的技术、资产和垂直部门转变为优化产品和服务的流动,通过整个价值流,跨越技术、资产和部门水平流向客户。​沿着整个价值流消除浪费,而不是在孤立的点上消除浪费,与传统的业务系统相比,创造了需要更少的人力、更少的空间、更少的资本和更少的时间来制造产品和服务的流程,成本大大降低,缺陷大大减少。企业能够以高品种、高质量、低成本的方式应对不断变化的客户需求,而且吞吐时间非常快。同时,信息管理也变得更加简单和准确。成为精益管理专业人员(CLMP),在职场上获得更多的机会!精益生产和服务一个流

  • 【美团·成都沙龙报名】美团收银系统微服务架构实践

    【美团技术沙龙】由美团技术团队和美团科协主办,每期沙龙邀请美团及其他互联网公司的技术专家分享来自一线的实践经验,覆盖各主要技术领域。 活动时间:2019年12月28日14:00-17:30 活动地址:四川省成都市武侯区都会路66号城南天府大厦(5楼成都人才服务中心)·蓉漂咖啡逐梦厅 报名链接:点我报名 /出品人/ 李战涛|美团高级技术专家 2017年加入美团,目前负责美团收银系列产品研发&团队管理工作,在美团期间,推出美团收银青春版等产品,目前美团收银产品在餐饮收银线上、线下市场市占均是第一。之前在小米工作过若干年,负责小米商城的在线促销系统、小米售后&仓库系统、大数据团队研发管理工作。 活动简介 美团收银系统为餐厅经营管理提供一体化的解决方案,在toB产品上,做好PaaS平台建设,打造核心竞争力,修炼好大团队规模化高效研发方法论,以便能深入参与广大餐饮商家生意,帮商家提高经营效率、改进经营质量,逐步建立和拓展健康的餐饮合作生态体系;同时打通线上和线下,让美团C端能提供更丰富的产品形态,提升用户就餐体验。 本次技术沙龙主要围绕美团收银系统微服务平台架构设计,以会员营

  • Scrum由来

    历史故事 在越南战争期间(1955年—1975年),对于美国战机飞行员而言,要执行100次飞行任务,飞到敌国领空被击落的概率是50%。 1967年,萨瑟兰还是一个没有经验的年轻飞行员,当时却是做最危险的一项工作:侦查。他的战机只装备了相机与备用燃料箱,飞到越南上空让领航员拍摄轰炸任务前后的照片。萨瑟兰在执行任务的时,肾上腺素就会飙升,但他从来都能冷静应对,面对如此危险境地总是很淡定。他将这一素质归功于在空军服役期间学到的风险管控能力。在训练中学会了观察、导向、决定和行动四件事。具体地讲,先观察目标区域,然后确认进入和退出目标区域的最佳路线,在未知事件面前及时地做出调整,最后在本能的驱动下采取果断的行动。迟疑不决会要了一个飞行员的命,但贸然行事也会要了一个飞行员的命。一旦领航员拍好照片,我就会用力拉操纵杆,提升飞行高度,远离危险区域。 越南战争结束后,萨瑟兰回到了美国,到斯坦福大学攻读统计学硕士学位。毕业后,萨瑟兰到了美国空军学院教授数学、统计学和概率论。后来,又到科罗拉多大学医学院攻读生物统计学博士学位。用几年时间时间找出促使一个正常细胞发生癌变的因素。萨瑟兰学到了很多关于系统论的知识

  • python基础===一行 Python 代码实现并行(转)

    原文:https://medium.com/building-things-on-the-internet/40e9b2b36148 译文:https://segmentfault.com/a/1190000000414339    #frommultiprocessingimportPool frommultiprocessing.dummyimportPoolasThreadPool importrequests urls=[ 'http://www.python.org', 'http://www.python.org/about/', 'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html', 'http://www.python.org/doc/', 'http://www.python.org/download/', 'http://www.python.org/getit/', 'http://www.python.org/community/', 'https://wiki.

  • python命名规范

    #不能用'frommoduleimport*'导入(相当于private) _xxx #类中的私有变量名(相当于protect) __xxx #系统定义名字 __xxx__ #单下划线结尾_:只是为了避免与python关键字的命名冲突 xxx_复制  

  • 栈的操作总结

    #include <assert.h> #include <stdio.h> #include <stdlib.h> #define length 10   typedef int DataType;   typedef struct Stack {     DataType* top;     DataType* base; //栈顶指针     int stackSize; }Stack; // 栈的实现接口  //初始化栈 void StackInit(Stack* s){     s->base=(DataType *)malloc(length*sizeof(DataType

  • 如何使用google drive的免费GPU进行深度学习

    最近想玩一玩深度学习,需要训练一些yolo之类的网络进行对象检测,苦于我的本子没有独显又没有实验室的机器给用,想起之前看到的google提供免费GPU用来学习的消息,就尝试一下。 利用JupyterNotebook测试GoogleDrive的GPU 首先登录GoogleDrive:https://drive.google.com。访问google需要一些不可描述的操作,此处不描述。 在左侧选择新建-更多-Colaboratory,如果没有就选择“关联更多应用”并搜索添加Colaboratory。 关联更多应用: 新建-更多-Colaboratory: 然后会新弹出一个标签页。 点击这里,可以对笔记本重命名 启动GPU 点击修改-笔记本设置,在弹出框内硬件加速器选择GPU并保存,即可启用GPU。 在方格内可以写python语句,也可以写以!开头的linux命令: tf.test.gpu_device_name()的输出为‘/device:GPU:0’即已使用GPU加速。可以看到google提供的显卡是TelsaK80,挺不错。 *注意,由于cd命令应当被实现为sh

  • js--table操作

            table排序 functionsort(){ varitems=document.getElementById("items"); for(vari=1,length=items.cells.length;i<length;i++){ items.cells[i].index=i; items.cells[i].onclick=function(){ console.time("hello"); varfunction_id=this.getAttribute("id"); if(function_id.indexOf("sort_")!==-1){ function_id=function_id.substr(5); }; varelements=window.table.getElementsByClassName(function_id,"td"); varoTR=[]; for(vari=0,length=elements.length;i&l

  • B. Blown Garland

    http://codeforces.com/problemset/problem/758/B B.BlownGarland timelimitpertest 1second memorylimitpertest 256megabytes input standardinput output standardoutput Nothingiseternalintheworld,Kostyaunderstooditonthe7-thofJanuarywhenhesawpartiallydeadfour-colorgarland. Nowhehasagoaltoreplacedeadlightbulbs,howeverhedoesn'tknowhowmanylightbulbsforeachcolorarerequired.Itisguaranteedthatforeachoffourcolorsatleastonelightisworking. Itisknownthatthegarlandcontainslightbulbsoffourcolors:red,blue,y

相关推荐

推荐阅读