DWZ

一行代码实现Python并行处理

ⅰ亾dé卋堺 提交于 2020-10-27 12:42:35
Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏"重"。而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容。 传统的例子 简单搜索下"Python 多线程教程",不难发现几乎所有的教程都给出涉及类和队列的例子: import os import PIL from multiprocessing import Pool from PIL import Image SIZE = (75,75) SAVE_DIRECTORY = 'thumbs' def get_image_paths(folder): return (os.path.join(folder, f) for f in os.listdir(folder) if 'jpeg' in f) def create_thumbnail(filename): im = Image.open(filename) im.thumbnail(SIZE, Image.ANTIALIAS) base, fname = os.path.split(filename) save_path = os.path.join(base, SAVE_DIRECTORY, fname) im.save(save_path)

Python数据分析,学习路径拆解及资源推荐

我的未来我决定 提交于 2020-10-25 14:29:00
关于Python数据分析,其实网上能够找到的学习资源很多,主要分为两类: 一类是提供各种资源的推荐 ,比如书单、教程、以及学习的先后顺序; 另一类是提供具体的学习内容 ,知识点或实际案例。 但很多繁琐而又杂乱的内容,除了给初学者增加理解和认识的噪音外,真正能够起到明确的方向指引导的,确实不多。 以至于很多人一开始没有明确的方向就一头扎进去, 学了很久却不知道自己到底在学什么 ,或者自己学了很久不知道能够做什么。 学习一门技术之前,你应该知道,你想要达成的目标是什么样的。 也就是说,你想通过这门技术来解决哪些问题。你就可以知道要达成这样的目标,它的知识体系是怎么样的。 更重要一点的是,每个部分是用来解决哪些问题,只有明确的目标导向, 学习最有用的那部分知识,才能避免无效信息降低学习效率 。 对于数据分析这件事情,有很多的应用场景: 比如你需要进行调研,来了解市场的宏观情况,窥探竞争对手,做可行性分析…… 比如你所在的工作部门产生了大量的数据,你需要考虑用这些数据来优化产品、营销、技术方案…… 比如你需要对产品、业务、用户进行分析,挖掘出重要结论,给上级提出合理的决策建议…… 通过这些常见的数据分析场景,你就可以获得数据分析项目的基本流程。 一般大致可以按 “数据获取-数据存储与提取-数据预处理-数据建模与分析-数据报告” 这样的步骤来实施一个数据分析项目。 按照这个流程

30个Python极简代码,10分钟get常用技巧!

烂漫一生 提交于 2020-10-21 14:31:54
学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则。本文是 30 个极简任务,初学者可以尝试着自己实现;本文同样也是 30 段代码,Python 开发者也可以看看是不是有没想到的用法。 Python 是机器学习最广泛采用的编程语言,它最重要的优势在于编程的易用性。如果读者对基本的 Python 语法已经有一些了解,那么这篇文章可能会给你一些启发。作者简单概览了 30 段代码,它们都是平常非常实用的技巧,我们只要花几分钟就能从头到尾浏览一遍。 1.重复元素判定 以下方法可以检查给定列表是不是存在重复元素,它会使用 set() 函数来移除所有重复元素。 def all_unique(lst): return len(lst)== len(set(lst)) x = [1,1,2,2,3,2,3,4,5,6] y = [1,2,3,4,5] all_unique(x) # False all_unique(y) # True 2.字符元素组成判定 检查两个字符串的组成元素是不是一样的。 from collections import Counter def anagram(first, second): return Counter(first) == Counter(second) anagram("abcd3", "3acdb") # True 3

复杂度分析的套路及常见的复杂度

[亡魂溺海] 提交于 2020-10-17 23:38:08
前言 本篇文章收录于专辑: http://dwz.win/HjK ,点击解锁更多数据结构与算法的知识。 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 上一节,我们一起学习了表示复杂度的几个符号,我们说,通常使用大O来表示算法的复杂度,不仅合理,而且书写方便。 那么,使用大O表示法评估算法的复杂度有没有什么套路呢?以及常见的复杂度有哪些呢? 本节,我们就来解决这两个问题。 前情回顾 在正式讲解套路之前,我们先回忆一下前面几节讲到的内容。 在第2节,我们学习了渐近分析法,将算法的复杂度与输入规模挂钩,随着输入规模的增大,算法执行的时间将呈现一种什么样的趋势,将这个趋势用函数表示,再去除低阶项和常数项,就得到了算法的时间复杂度。 在第3节,我们分别从最坏、平均、最好三种情况来分析了算法的复杂度,得出结论,一般使用最坏情况来评估算法的复杂度。 在第4节,我们通过动态数组的插入元素及经典快速排序的时间复杂度,解释了有的时候不能使用最坏情况来评估算法的复杂度。 在第5节,我们从读音、数学、通俗理解三个方面分析了各种表示算法复杂度的符号,得出结论还是使用大O比较香,大O代表了算法的上界,它与前面讲到的最坏情况往往是对应的。 所以,这里所说的套路也是针对大部分情况,也就是最坏情况,对于一些个例,比如经典快排,我们虽然也是使用大O表示他们的复杂度,但是,其实是一种均摊的复杂度。 好了

StackOverflow 上面最流行的 7 个 Java 问题!

随声附和 提交于 2020-10-11 22:09:37
阅读本文大概需要 5 分钟。 原文:https://dwz.cn/Boy5tcHJ 译文:https://dwz.cn/j1hgReGd StackOverflow发展到目前,已经成为了全球开发者的金矿。它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西。 这篇文章是在我们审阅了StackOverflow上最流行的Java问题以及答案后从中挑出来的。即使你是一个有丰富经验的开发者,也能从中学到不少东西。 一、分支预测 问题链接: https://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array StackOverflow上最多投票的一个Java问题是: 为什么处理一个排序数组要比非排序数组快的多 。 为了回答这个问题,你需要使用分支预测(branch prediction)。分支预测是一种架构,旨在通过在真实的路径发生前猜测某一分支的下一步来提升处理过程。 分支在这里即一个if语句。这样的话,如果是一个排序数组,那么分支预测将会进行,否则不会进行。 StackOverflow上的一个回答者,链接: http://stackoverflow.com/questions/11227809

了解红黑树的起源,理解红黑树的本质

末鹿安然 提交于 2020-10-06 06:38:04
前言 > 本文收录于专辑: http://dwz.win/HjK ,点击解锁更多数据结构与算法的知识。 你好,我是彤哥。 前面两节,我们一起学习了关于跳表的理论知识,并手写了两种完全不同的实现,我们放一张图来简单地回顾一下: 实现跳表的关键之处是在有序链表的基础上加上各层索引,通过这些索引可以做到O(log n)的时间复杂度快速地插入、删除、查找元素。 说起跳表,我们就不得不提另一种非常经典的数据结构——红黑树,红黑树相对于跳表来说,虽然时间复杂度都是O(log n),但是红黑树的使用场景相对更广泛一些,在早期的Linux内核中就一直存在红黑树的实现,也运用在了更高效的多路复用器Epoll中。 所以,红黑树是每一个程序员不得不会的知识点,甚至有些变态的面试官,还会让你手写红黑树的一部分实现,比如左旋、右旋、插入平衡的过程、删除平衡的过程,这些内容非常复杂,靠死记硬背往往很难彻底掌握。 彤哥也是一直在寻找一种红黑树的记忆法,总算让我找到了那么一种还算不错的方式,从红黑树的起源出发,理解红黑树的本质,再从本质出发,彻底掌握不用死记硬背的方法,最后再把它手写出来。 从本节开始,我也将把这种方法传递给你,因此,红黑树的部分,我会分成三个小节来讲解: 从红黑树的起源,到红黑树的本质 从红黑树的本质,找到不用死记硬背的方法 不靠死记硬背,手写红黑树 好了,下面我们就进入第一小节。 红黑树的起源

到底什么才是真正的空间复杂度?

只谈情不闲聊 提交于 2020-10-03 04:46:24
前言 本篇文章收录于专辑: http://dwz.win/HjK ,点击解锁更多数据结构与算法的知识。 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 上一节,我们一起学习了复杂度分析的套路和常见的复杂度。 但是,我们的案例基本都是以时间复杂度为主,很少接触到空间复杂度。 那么,到底什么才是真正的空间复杂度呢?在空间与时间发生冲突时又该如何权衡呢? 本节,我们就来解决这两个问题。 来个例子 现在有一个算法是这样的,给定一个数组,将数组中每个元素都乘以2返回,我实现了下面两种形式: private static int[] multi1(int[] array) { int[] newArray = new int[array.length]; for (int i = 0; i < array.length; i++) { newArray[i] = array[i] * 2; } return newArray; } private static int[] multi2(int[] array) { for (int i = 0; i < array.length; i++) { array[i] = array[i] * 2; } return array; } 暂且不论这两个算法孰好孰坏,你来猜猜他们的空间复杂度各是多少? 你可能会说第一个算法的空间复杂度为O

如何进行算法的复杂度分析?

家住魔仙堡 提交于 2020-08-18 02:54:32
前言 本篇文章收录于专辑: http://dwz.win/HjK 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 大家都知道,数据结构与算法解决的主要问题就是“快”和“省”的问题,即如何让代码运行得更快, 如何让代码更节省存储空间。 所以,“快”和“省”是衡量一个算法非常重要的两项指标,也就是我们经常听到的时间复杂度和空间复杂度分析。 那么,为什么需要复杂度分析呢?复杂度分析的方法论是什么呢? 这就是我们本节要解决的问题。 好了,进入今天的学习吧。 为什么需要复杂度分析? 首先,我们来思考一个问题:对于两个算法,我们如何评判谁运行得更快,谁运行时更节省内存? 你可能会说,这还不简单,把这两个算法运行一遍,统计下运行时间和占用内存不就可以了吗? 没错,这确实是一种不错的方法,而且它还有个非常形象的名字: 事后统计法 。 但是,这种统计方法具有非常明显的问题: 不同的输入对结果影响很大 对于一些输入,可能算法A执行得更快;对于另外一些输入,可能算法B执行得更快。比如,我们后面要学习的排序算法,输入的有序性对于不同的排序算法的影响是完全不同的。 不同的机器对结果影响很大 对于同样的输入,可能在一台机器上算法A更快,而在另外一台机器上算法B更快。比如,算法A可以利用多核而算法B不能,那么CPU的核数对这两个算法的影响将截然不同。 数据规模对结果影响很大 当数据规模小时

腾讯短网址在线生成(url.cn短网址) 2020最新腾讯短网址生成api接口推荐

戏子无情 提交于 2020-08-15 16:48:50
短网址生成指的是把帮您把冗长的URL地址缩短成8个字符以内的短网址。目前市面上的短网址品牌很多很多,但是最常见的还是下面说的几种: 腾讯短链接:url.cn 淘宝短链接:c.tb.cn 新浪短链接:t.cn 百度短链接:dwz.cn 腾讯短网址(url.cn)就是使用腾讯的API接口将冗长的链接转换成超短的url.cn链接。使用url.cn短网址更易于用户记忆,利于用户转化。 url短链接最开始是为了对抗http://t.cn推出的网址压缩服务,后来其微博倒闭,官方并没有停止http://url.cn的解析,但也没有对外开放接口。 优点:稳定性好,故障率极低,很少出现异常,微信里被封概率比较低 用的多的就是腾讯短网址,所以我们重点讲下腾讯短网址 ① 调用api接口时,只需将 “ http://www.baidu.com”换成需要缩短的长网址即可 。 ② 接口支持url参数,当url中出现 & 符号时,请用 %26 代替(或者使用url编码格式),否则参数可能会丢失。 ③ 填写url时,必须要以http(s)://开头,否则可能会导致生出的短网址无法访问原网站。 PHP调用演示: $url = ' http://www.baidu.com '; $api_url = ' http://www.qqdwz.cn/tcn/api?url_long=http://www.baidu.com

复杂度分析的套路及常见的复杂度

时光怂恿深爱的人放手 提交于 2020-08-15 12:36:32
前言 本篇文章收录于专辑: http://dwz.win/HjK ,点击解锁更多数据结构与算法的知识。 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 上一节,我们一起学习了表示复杂度的几个符号,我们说,通常使用大O来表示算法的复杂度,不仅合理,而且书写方便。 那么,使用大O表示法评估算法的复杂度有没有什么套路呢?以及常见的复杂度有哪些呢? 本节,我们就来解决这两个问题。 前情回顾 在正式讲解套路之前,我们先回忆一下前面几节讲到的内容。 在第2节,我们学习了渐近分析法,将算法的复杂度与输入规模挂钩,随着输入规模的增大,算法执行的时间将呈现一种什么样的趋势,将这个趋势用函数表示,再去除低阶项和常数项,就得到了算法的时间复杂度。 在第3节,我们分别从最坏、平均、最好三种情况来分析了算法的复杂度,得出结论,一般使用最坏情况来评估算法的复杂度。 在第4节,我们通过动态数组的插入元素及经典快速排序的时间复杂度,解释了有的时候不能使用最坏情况来评估算法的复杂度。 在第5节,我们从读音、数学、通俗理解三个方面分析了各种表示算法复杂度的符号,得出结论还是使用大O比较香,大O代表了算法的上界,它与前面讲到的最坏情况往往是对应的。 所以,这里所说的套路也是针对大部分情况,也就是最坏情况,对于一些个例,比如经典快排,我们虽然也是使用大O表示他们的复杂度,但是,其实是一种均摊的复杂度。 好了