Transcript #256: And the best open source project prize goes to ...
Return to episode page view on github00:00 - Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:04 This is episode 256, or as Anthony Shaw likes to put it, two to the eighth, recorded October 27th, 2021.
00:12 Again, unless you're Anthony, which is probably like a totally different day in the future 'cause he's in Australia.
00:16 I'm Michael Kennedy.
00:17 - And I'm Brian Okken.
00:19 - And I'm Anthony Shaw, hello.
00:20 - Hey, hey, Anthony.
00:22 How is the 28th?
00:24 Is the next day gonna be good or things are okay?
00:26 - Yeah, it's pretty sunny today, it's nice.
00:28 - Yeah, right on.
00:29 - Okay, so the world hangs together for one more day.
00:32 Fantastic.
00:33 You've been here before.
00:34 You've been on Talk Python a bunch of times, friend of the show, all sorts of stuff.
00:38 So I'm sure many people know you, but just tell people a bit about yourself.
00:41 You're doing more techie things these days.
00:44 You're a little closer to the code, maybe?
00:47 - Yeah, so earlier this year, I started working at Microsoft and worked with Nina Zakharenko on Python inside Microsoft.
00:55 And yeah, a lot of what I'm doing at the moment It's just running around, breaking things, sometimes on purpose.
01:02 Yeah, just saying how we can improve our experience and working with VS Code and Azure and a whole bunch of other stuff.
01:08 So yeah, it's been a while since the last episode was episode 100, I think.
01:13 Wow, you're hitting the big numbers.
01:15 So yeah, this two to the eighth is a significant milestone, I think.
01:20 It is.
01:21 It's pretty cool.
01:22 Yeah, awesome.
01:23 Well, we're happy to have you here.
01:24 Thanks for being here.
01:25 Also, something to do with a puppy I've seen on Twitter.
01:26 Oh yeah, I got a puppy as well.
01:29 He's not a golden something.
01:31 He's a border collie, but he's kind of golden colored and he's not in the room at the moment.
01:39 He's not allowed in here while I'm recording.
01:40 I thought it would be a bit chaotic.
01:44 My puppy sometimes is here, but it's very bizarre the way that puppies socialize around COVID instead of us being gone and then we come home.
01:52 She now knows and understands the expressions I make to end a Zoom call.
01:57 So she'll sit quietly for an hour and as soon as I say goodbye on Zoom, she's like, "We're ready to go.
02:00 Let's go." It's super bizarre, but yeah, that's the world we live.
02:04 So enjoy the new puppy.
02:05 Brian, you want to kick us off with our first topic here?
02:09 - Lucas Lange, he's, what is he again?
02:11 The developer in residence?
02:12 - Yes.
02:13 - For Python.
02:14 Anyway, he wrote an article called, "Where Does All the Effort Go?
02:18 Looking at Python Core Developer Activity." And I kind of really like this article.
02:25 Not only talks about really what's going on with developers and who's doing what.
02:31 To start off with, he talked about how he got this data.
02:34 So this is also sort of a data processing, sort of information scraping sort of article.
02:42 He's looking at the GitHub repository data for CPython, of course, and specifically pull request data. So there's a discussion about he's even using Dataset, which is nice. We've covered that on the show. And even lists the SQL queries that he has to try to get some of this data.
03:03 So some of the neat data that he's got. Oh, also since Git, the data is from the time when CPython moved to GitHub. So that's February 10, 2017. And he mentions that it's up through October 9th is when he pulled the data.
03:20 So, but all the information is there so you could grab it yourself if you want.
03:25 Even the little scripts he's got for modifying some of the data.
03:29 But so some of the interesting things, the top parts of CPython that are modified, it's probably not that surprising that ciaval.c is involved in 259 merge requests.
03:42 It's the top merged file.
03:45 - ciaval.c, yeah.
03:47 That's where the bytecode processor is.
03:50 So yeah, that's where all, that's the center point or the tunnel everything flows through.
03:55 Does that make sense?
03:56 - Yeah, and then goes on and looks at which contributors merged, have merged.
04:02 And this is an interesting thing or had been involved in PRs.
04:07 It lists the top, he lists the top 50 people but it includes some bots, which is interesting.
04:14 - I was gonna ask that.
04:15 I was thought BetaViz is probably gonna be up there or Mrs. LinkedIn.
04:18 - Yeah. - Both bots, by the way.
04:21 - So this is a, I'd actually love to talk to, or either me or Michael or somebody, talk to one of the, or Python people, to talk about the different bots that are used and why they're used.
04:32 'Cause that's an interesting thing, of large projects using bots to help out with some of the work. - Yeah, that is interesting.
04:38 - And anyway, the non-bots, there's a couple of people that stand out, Victor Stinner and Serhii Sorkaka, so I apologize for messing up your name, but that's, they're really up there.
04:54 So that's pretty interesting that they're involved a lot.
04:57 And then there's a description here, a nice note that Lucas writes, "Clearly it pays to be a bot or a release manager since that's naturally causes you to make a lot of commits.
05:08 Victor and Serhii are neither of these things and still generate an amazing activity.
05:13 Kudos.
05:14 And also it's not a competition, but it's still interesting to see who makes all these recent changes.
05:20 By the way, this, that top PR thing was only since the beginning of January, 2020.
05:25 So taking a look at the more recent stuff.
05:27 And then one of the things that's interesting in looking at who contributed where, I didn't know this.
05:34 There's an experts index.
05:36 So that was linked.
05:39 Ooh, it's asleep.
05:41 An experts index that is part of the Python developers guide.
05:45 I didn't know this was here.
05:46 It's a kind of lists parts, some parts of the system, but there's blanks.
05:51 And so there's, so Lucas also, or listed to the script and pulled out the top five contributors to each file, which is kind of an amazing list of all of the different, of, you know, the top five people for every file within CPython.
06:11 So if this is kind of neat, because if you're going to do a PR or you're working on a fix or something and you're a little confused by some of the code, one of these people might be able to help you out.
06:21 So this is kind of a neat list.
06:23 So there's a, at the bottom of the article also, it talks about some of the, some of the takeaways from this.
06:30 Don't have this right off the top of my head.
06:34 Merging, how long it takes to merge a PR.
06:37 So it's hard to draw information from this data because it's all over the map.
06:43 The standard deviations are pretty large.
06:45 But if a core developer merges their own PR, it takes on average about seven days to get through the process, give or take 42 days.
06:53 And then core developer authoring a PR, which is merged by somebody else, it takes longer, about 20 days, give or take 78.
07:02 And then community author, it's up to 20 days, give or take 80.
07:06 But I mean, I work on commercial projects that are not really that much faster than this.
07:11 So it's not too bad.
07:14 What do you think of this article?
07:15 - Yeah, Anthony, what do you think of this?
07:17 You spent a lot of time inside the CPython code.
07:19 I mean, you did write a book, "CPython Internals," which people can check out, right?
07:23 - Yeah, I did write a book about CPython source code.
07:26 So it's interesting.
07:28 First of all, I'm super excited about Lukasz being the new developer in residence.
07:32 I think he's got the right approach and he's already made really promising progress, I think, in terms of trying to make the community contribution process a bit slicker.
07:46 Yeah, that's that at the bottom.
07:48 Like, just watching the GitHub repository, core developers working on the repository and making changes and stuff, from the outside, looks fairly seamless.
07:58 My own personal experience has been, sometimes it's quite, like, If your PR gets responded to within the first week, then it'd probably get merged pretty quickly.
08:09 And then if it doesn't, then it just kind of ends up in the pile.
08:13 And I've had ones in there for like three years.
08:17 - Right, the average was seven, but it could go out at like another 40 days.
08:21 And it's probably like really quick or really far.
08:24 - Well, that metric is how long they take to get merged, which I guess requires that they are merged.
08:30 - Oh yeah.
08:32 I mean, there's basically just like loads of people contributing stuff.
08:37 And there aren't enough people with enough time to sift through it all.
08:42 And it just makes it really tricky.
08:43 And the project needs to continue marching forward.
08:46 And there's people who are dedicated to working on the core developers.
08:50 But you know, some of the community contributions are really valuable.
08:54 I think that's what's promising to me is that Lukasz is kind of looking at that and not just taking this role on as I'm going to be 100% core developer.
09:06 Because yeah, there's already lots of other people on the team who are making some amazing contributions.
09:12 You know, Pablo has been working on the new Pasa and now he's working on this like stacklist changes in 3.11.
09:20 Yeah, there's so many things going on at the moment in CPython.
09:24 So it's really encouraging to see.
09:26 Yeah, it's super encouraging.
09:27 I think Lukasz is doing a good job sort of smoothing out the edges to just make it easier for everyone to go faster, which I think a lot of times in teams, you know, not specifically here, but in general, there's these people who are kind of, oh, that's the person you can ask to make the CI work again when you break it.
09:43 This is the person you asked, like, you just set up a new machine and remembers how to do that.
09:46 And like, you don't necessarily get direct credit for doing that work, but without them, it's just way harder.
09:52 And I feel like he's doing that for CPython behind the scenes.
09:55 - Yeah, the experts index is really helpful if you want to get involved in bug triaging.
09:59 So that's something that people are open to help with.
10:03 If you go on bugs.python.org and you want to help to triage bugs, often what you have to do is kind of look at it, make sure that the person who's reported it is filled in all enough information, and then basically add people on the experts index to something called the nosy list, which is like a CC list basically on the bug.
10:22 And then, yeah, it's just kind of directing it to the right people.
10:25 Once you've done that for a while, then you kind of get given like a triage flag in your user.
10:31 And then if you've been doing that for even longer, then you could be promoted up to a core developer.
10:35 And there's a few people who've gone through that, that route over the last couple of years.
10:39 - All right, Anthony, while you're talking, I got two things to share out of the audience.
10:43 Dimitri Figal, hey Dimitri, great to see you here.
10:45 Dimitri says, thanks for inviting Anthony.
10:48 He's someone I look up to, very nice.
10:49 - Thanks Dimitri, good to see you.
10:51 - Yeah, and Waylon, who was recently on Talk Python.
10:53 Hey Waylon, says what a great lineup here.
10:55 also kind of for you and also Henry Schreiner.
10:58 Hey, Henry, also recently on DocPython.
11:00 Says both PRs I've been involved with to CPython got in in about a day, I believe, which that's pretty amazing.
11:07 - That's pretty good, yeah.
11:08 - That's great.
11:09 - Yeah, so before we move off from this one, Brian, this is a good pick.
11:13 One thing I just wanna point out as well is all of these cool stats and these graphs and everything we're seeing here apply to CPython because it's on GitHub, right?
11:20 - Yes.
11:21 - But you can run the same code and run dataset from Simon Willison against it.
11:25 but against a different repo, I would imagine, right?
11:28 - Oh, yeah.
11:28 - Yeah, so if you run a project, you could probably do a similar analysis for your project.
11:33 - That's a good idea.
11:34 - Yeah, all right.
11:35 Speaking of good ideas, and it's interesting that Henry's out in the audience, 'cause I feel like we might have been responsible for this article.
11:43 Clearly we did not write it.
11:44 We may have triggered, is what I'm saying.
11:46 Mostly me, in not the positive way, right?
11:49 So this is a cool article by Paul Gansel, who is also over on Talk Python, talking about the mysteries of date time and stuff.
11:57 There's all sorts of cool things.
11:58 He maintains the dateutil package and setup tools projects and so on over on episode 271.
12:05 So he wrote an article, said why you shouldn't invoke setup.py directly.
12:10 And the reason I think I might have somehow had something to do this is Henry was on talking about CI build wheel and all the proper ways to build packages.
12:18 I said, oh, you can run setup Python, setup py space, you know, wheel or bdest or something.
12:23 and they're like, no, no, no, you could, but please don't do that.
12:26 And then here we have this article like two days later.
12:27 So I don't know if that was part of that conversation, but it's a really good article talking about the state of building Python packages.
12:36 And it says, you know, look for a long time, set up tools and distutils were the only game in town when it came to creating Python packages, right?
12:44 So you could do something like invoke Python setup, bdist, sdist, wheel, and so on.
12:49 Wait, I see.
12:50 So Paul is actually in the audience, real time, fantastic.
12:53 Hey, Paul, says, I think I did it because Matthew Fiker asked for it on Twitter and I got sniped.
12:58 Yeah, perfect.
12:58 OK, good.
12:59 So I'm-- just a coincidence.
13:00 Fantastic.
13:01 But yeah, so the reason this is extra interesting to me-- and thank you, Paul, for writing it-- is I was still doing this Python setup UI various commands.
13:11 And I was talking to Henry.
13:12 He's like, no, you shouldn't do that.
13:14 You should do it this other way.
13:15 I'm like, what?
13:15 He said, well, OK, well, how should I do this?
13:17 Oh, you should use build, the build package.
13:20 What is this build package you speak of?
13:22 You know, so we've talked about pyproject.toml a bunch of times.
13:26 We've talked about things like flit and stuff that will use it, right?
13:30 This all comes from PEP 517.
13:33 And there is a package called build.
13:35 You can pip install build.
13:37 And then you do things like Python-M for module, run build.
13:41 And you can say, I want an estus, I want a wheel and things like that.
13:45 And this acts as a front end to things like set up tools to the various backends that do building or pilot.
13:54 - Split.
13:55 - Split, yeah.
13:55 All these different things that understand it, right?
13:57 So it says, "All direct invocations," Paul says, "All direct invocations of setup.py are effectively deprecated in favor of purpose-built standard-based CLI tools like pip, build, and tox." So this is quite a long article.
14:12 There's a lot to go through.
14:14 It has some interesting history.
14:16 So in the early days, there wasn't even distutils.
14:18 And then in Python 2, distutils got added and then set of tools came along.
14:23 And then there were, there's, you know, while they work, there's still problems.
14:26 Like for example, you might have dependencies that you have to install to run the setup, but the way you install stuff and figure out what you depend upon is by running the setup.
14:38 So what do you do?
14:39 So an example of that would be Cython, right?
14:40 So for, and you might have to import Cython and then the invocation of calling setup, you tell it how to Cythonize the PYX files, right?
14:49 But that's obviously not gonna work because you're gonna have to have Cython installed, but how do you express that?
14:56 You know, it's like this chicken and egg problem, right?
14:58 So let me pull up my notes here.
15:01 Yeah, so basically one of the big questions was why am I not seeing deprecation warnings?
15:06 Let me go down a little further.
15:07 Yeah, so if I'm not supposed to do this, why isn't screaming from the top of its terminal, Stop, stop, stop, why are you doing this, right?
15:16 So there's a lot of commands that still have indirect uses of the distutils and stuff.
15:22 So it's a little tricky to deprecate it, but basically you should consider it deprecated.
15:27 You know, at the end of the day, it's better to replace your set of commands with tools like build instead of set up pysdist or bdistwheel or tox and nox instead of set up pytest and other commands backed by projects intended to support that.
15:42 - Yeah, that sound good to you guys?
15:44 Where were you on this?
15:45 - Brian, you go.
15:47 - Well, I don't use--
15:49 - Have opinions.
15:50 - I mean, I kind of indirectly use build, but I basically just use flit.
15:53 So I'm not writing things with C extensions, so pure Python stuff, I just do a flit build or whatever, it works fine.
16:02 - Yeah, so that's kind of, I mean, that's using the pyproject.toml stuff, right?
16:06 - Yeah. - Yeah, Anthony?
16:08 - I kind of, if I'm starting a project now, then I use pyproject.toml and the project doesn't have a setup.py.
16:14 There were some reasons why I had to add one in the past, but that's mostly fixed now.
16:19 So I'm either using flit or something similar like poetry.
16:23 Yeah, and I've worked on projects years and years ago where the setup.py was like, just ended up just being a script to run ad hoc commands.
16:32 Like there was a test, setup.py test, and then there's like, and lint, and...
16:37 (laughs)
16:38 - Yeah, what does that have to do with installing software, right?
16:41 Why is that?
16:42 Yeah, nothing.
16:43 It was just like, yeah, it just ended up being an entry point to do things.
16:48 And one happens to be installed, but there's a bunch of other stuff you might randomly do.
16:52 Yeah, and it's fine that it's being deprecated, but it just, you know, CPython still does that.
16:56 Like the setup.py and CPython is still used in that way and called and invoked directly in the source code.
17:04 This is so, yeah, it's good that it'll be deprecated, but I don't think the tooling is quite ready yet.
17:10 He's not really saying to get rid of setup.py, just don't use it, don't run it directly.
17:15 - Yeah, find something better.
17:17 - pip should do that.
17:18 pip should do the discovery for you, the pip 517, and run the correct steps for you.
17:27 - Yeah, absolutely.
17:28 So a couple of comments out in the live stream is that while recommending build, it's nearly impossible to Google to find it.
17:35 And Ray says, "I love and hate the name.
17:38 So authoritative, so un-Googleable, and a bit hard to use in conversation, but yeah, yeah, for sure.
17:44 So I think if you want to take away from this conversation, right at the top, there's a TLDR section that Paul put in.
17:49 Click on the summary, takes you down to a summary, and you can go to a table, and it says, "I was about to type this.
17:55 "What should I do instead?
17:56 "I was about to type setup.py sdist.
18:00 "What should you type?
18:01 "Python -m build," having build installed.
18:04 Or if I was gonna type setup.py bdist wheel, I should type Python-M build --wheel or something like that.
18:11 Setup.py test, oh, maybe pytest or Tox or Knox.
18:14 We covered Knox recently with Preston, which was really fun, I believe, episode.
18:18 Setup.py install, no, that's pip install.
18:21 Python setup py develop, no, that's pip install -e.
18:25 And then as well as upload, it goes back to Twine.
18:28 So yeah, anyway, I think this is the most actionable bit here.
18:32 - Yeah, it's good.
18:33 - Yeah, indeed.
18:34 All right, well, Anthony, let's talk about keeping an eye on things.
18:38 - Yeah, so I wanted to highlight a project which has been in the works for a while, but they've just recently finalized the specification.
18:47 So this is called OpenTelemetry.
18:49 It's a part of the Cloud Native Computing Foundation, the CNCF, and it's a cross-language event tracing, performance tracing, logging, sampling framework for applications, in particular for distributed applications.
19:07 So if you've got an application which is spread across multiple microservices and you wanna trace things or monitor performance or whatever across all of the stack.
19:18 - It's a super hard problem, right?
19:19 Maybe you've got a Docker container running this thing, that Docker container calls some other service on a different Docker container and maybe the logs are even transient.
19:27 What are you gonna do to know if something went wrong?
19:30 - Yeah, exactly.
19:31 And if you've got an application that's spread across, well, if it's built into multiple microservices, then, and one of those services has a fault, it's really hard to know where that fault came from.
19:41 So like, if it just says error, blah, blah, blah, blah, you're like, okay, so what triggered that error?
19:47 And which requests from a user at the front end, or like, how did the error happen in the first place?
19:53 And how can I fix it?
19:54 And also like identifying, I guess, tracking performance across your application and looking at that.
20:00 So there's been attempts at doing this in the past, open tracing and open census were the two kind of projects beforehand.
20:08 So this new project, OpenTelemetry, is a merger of open tracing and open census.
20:14 There's engineers from some big companies working on this, including Microsoft, Amazon, Splunk, Google, Elastic, New Relic, and a whole bunch of others as well, including actually full-time engineers from some of those companies working on this.
20:30 So yeah, I've been working with an engineer at Microsoft who works full-time on this project.
20:36 He works on, actually there's a few people who work full-time on this, but the person who works full-time just on the Python components to this.
20:43 So the Python SDK basically allows you to instrument lots of different frameworks.
20:48 So you can basically drop it into Flask or Django or Starlette so if you're using FastAPI, and you can sort of instantly get capture of what requests are going into the application, when there's been a crash, like where that exception's gone, all the logging information.
21:08 You can look at performance records and stuff.
21:09 I've been sharing some examples of where I've wrapped it around a FastAPI app, and then I can see like performance of what's the average request time for each of these parts of the application, and where is that time spent, even down to like--
21:24 - Can you say like this is the data layer section, and this is the business logic and here's the simulation or whatever.
21:30 - Exactly, so I can kind of see like, almost like a cool stack, but across the actual components of the app.
21:36 So here's where it came into FastAPI.
21:38 Here's where it went into database.
21:41 Like here's how long the query took.
21:42 Here's how long the ORM took to remodel it.
21:45 Here's how long Jinja2k to build the template.
21:48 Like, so you can kind of see a breakdown of all the different components and how things are being pulled together.
21:54 So there's two parts of OpenTelemetry, well, there's actually more than two parts.
21:59 I am actually really appreciative of, even though there are lots of engineers from big companies, this hasn't been over-engineered yet.
22:09 And I'm really hoping it doesn't.
22:10 - Is there a factory-factory method in here?
22:12 - Yeah, exactly.
22:13 Especially 'cause it's like so generic.
22:16 There's a real danger of it being just over-engineered.
22:19 So if you go on the website and go to registry and then pick Python on the right-hand side, you'll see the kind of different extensions you can get.
22:26 So instrumentation is basically like, this is the thing I want to monitor.
22:30 And it could be like ASCII or async Postgres, for example, database, Celery, Django, Elasticsearch, Flask, like there's a stack of app stacks that you can just drop it into and it will give you all the tracing information.
22:47 And then there's these things called exporters, which is basically like once it's got the information, can send it to somewhere like Datadog or New Relic or Azure and AWS, obviously, and Google monitoring as well.
23:02 And yeah, actually, I just worked on recently, if you just want to hack around with it, there's an exporter for Rich that just basically prints it on the console so you can see everything that's happening.
23:14 In color probably, yeah.
23:15 Yeah, yeah, yeah.
23:16 So it's all kind of color coded.
23:18 It's really nice, actually.
23:20 So yeah, I'm really excited about this.
23:21 I've been mostly trying it with FastAPI, as there aren't really many frameworks for setting up like decent monitoring and tracing and FastAPI applications.
23:33 And yeah, I think it's really promising.
23:34 So I suggest you check it out.
23:37 And if you see a framework that needs support or something, then, you know, this is all open source, and they're all accepting contributions as well.
23:46 And it's fairly straightforward to add support.
23:48 - Yeah, it's got Postgres, MySQL, MongoDB, Pyramid, Redis, all sorts of good stuff in here.
23:54 Another thing maybe worth pointing out here is because this crosses languages, right?
24:00 There's a Python one, but there's also a .NET one, there's a Swift one, and so on, which means there might be scenarios where I've got like, say, a mobile app written in Swift, and then I've got the backend written in Python and FastAPI or something, and you wanna put those together.
24:15 Like, because it goes across those languages, Theoretically, that's a thing that could happen.
24:19 - Absolutely, yeah, and you can pull that all together and it would give a request a trace ID.
24:25 So when a request comes into the front end, a trace ID could carry across the different stacks as well, which is pretty cool.
24:33 - Yeah, yeah, very cool.
24:34 This is neat.
24:35 Awesome, thanks for covering it.
24:37 Now, before we move on, Brian, we have a sponsor for this episode.
24:40 That's cool, huh? - Yay, yeah.
24:41 - Yay, thanks to Shortcut.
24:44 Shortcut, formerly known as Clubhouse.
24:46 So they're a really cool project management tool.
24:49 And they asked the question, have you ever really been happy with project management?
24:52 You know, how's your JIRA or whatever, right?
24:57 How much are you loving it?
24:58 So they basically say most are either way too simple for growing engineering teams to manage everything or too complex and just throw in the kitchen sink and you don't wanna work with it.
25:09 You gotta constantly tweak it to make it work for you.
25:11 So Shortcut, who used to be known as GoBounce, is different.
25:14 They try to be simple.
25:15 project management built specifically for software teams.
25:18 It's fast, intuitive, flexible, many other nice positive adjectives.
25:21 So some of the highlights are team-based workflows, individual teams can use shortcuts, default workflows, or customize them to match the way they work.
25:30 Also organizational-wide goals and roadmaps.
25:33 So these workflows automatically get tied into larger goals and feed into like a bigger system outside the team.
25:39 Good source control integration, GitHub, GitLab, Bitbucket, all those types of things.
25:44 One thing that I really love is the web app has hotkeys.
25:48 So it's keyboard friendly, just like HR and VS Code, whatever, right?
25:53 I don't know why more web apps don't have hotkeys.
25:55 It's not particularly hard, but they do, which is great.
25:57 Iteration planning, so you can set your priorities and let Shortcut run the schedule.
26:01 You get nice little burndown charts and so on.
26:02 So check them out at shortcut.com/pythonbytes, shortcut.com/pythonbytes, because you shouldn't have to project manage your project management.
26:11 That does not sound fun.
26:12 So let them do it, it's their job.
26:13 Now, before we move off to the next topic, Robert Robinson on the audience, Hey, Robert, this open telemetry sounds interesting.
26:20 Wants to try it out.
26:21 I, I do as well.
26:23 I feel like this is the kind of stuff that you just keep putting off integrating into your system.
26:27 And then once you finally, finally do, you're like, Oh, look how awesome this is.
26:30 We can see what's going on.
26:31 And it's actually, did you know this part was crashing?
26:33 No, I didn't know that.
26:34 Nobody looked at the log and it was just eaten.
26:36 Even the exception, right?
26:38 Yeah.
26:38 Tricky, tricky.
26:39 All right, Brian, you got the next one.
26:41 So Python's got a few built-ins.
26:45 Not a ton, but quite a few.
26:48 So there's an article from Tushar Sadwani called "Understanding All of Python Through Its Built-ins." And he's got a pretty ambitious goal here to understand everything.
27:03 But I actually really enjoyed even the first part of it.
27:07 So I started reading it.
27:09 I've been, especially giving it a shot.
27:12 I got a shout out to him.
27:13 He's been fairly involved on Twitter, answering questions and being involved in conversations.
27:19 So that's a good way to get noticed.
27:22 But there's a, starts off talking about scope.
27:26 So what is built-ins are not just things that Python has built in, but there's also, it has a relevance to the scoping rules.
27:34 And he called it the LEGB scoping rules.
27:37 So it's when Python, if Python sees a symbol, first it looks in the local scope, then the enclosing scope and the global scope, and then the built-in.
27:49 And built-ins really are just anything that's in the built-in package.
27:52 So, and that, actually that discussion, it's a really pretty good discussion and it helped, it's good for especially newbies to understand, but even advanced beginners sometimes don't quite understand what's going on here.
28:05 - Yeah, Brian and Anthony, you both come from C style languages historically, right?
28:10 Or at least you've spent a lot of time there, right?
28:12 Brian, do a lot of C++, Anthony, I know you've done some C# and stuff.
28:15 Did the scoping story of Python confuse you and kind of leave you a little uncertain in the beginning?
28:21 - Yes, definitely.
28:22 Especially coming from C++ where it's very well-defined and different. - If it's in the curly braces, it's alive, afterwards it's gone, right?
28:29 Like, wait a minute, that's not the story at all.
28:32 - Right, and also you've got so many nested curly braces it could be anywhere and it's not really, it seems like, actually we just don't do that too much in Python, but Anthony probably know better than me.
28:43 If I've gotten like multiple nested curly braces, we don't have curly braces, but multiple nested indentations, does the scope sort of look in outer and outer and outer ones, is that what non-local means?
28:59 as a non-local keyword, which is like a whole other thing.
29:03 (laughing)
29:04 - That's a completely different thing.
29:05 Okay.
29:06 - I think I've ever used it.
29:07 - Closure, variable capture, basically, yeah.
29:10 - Yeah.
29:11 - Yeah.
29:12 - But the difference in global really freaked me out because really we were pounded into our heads everywhere is to never use global variables.
29:19 - Yeah.
29:20 - But global's different.
29:21 The global namespace is not a global variable.
29:23 It's more like a module level.
29:27 - Yeah, yeah, or like a static variable in a class maybe would be what other people might call it.
29:33 - Yeah, it's not a dangerous thing in Python.
29:36 - Yeah, so I didn't mean to derail you that much, but I think it's interesting to think about the built-in scope, the global scope, these different scopes, because it's such a different world from the intuition you get coming from all the C languages.
29:46 - Yeah, also just sort of just really enjoyed looking at the language through the scope of built-ins.
29:50 It's an interesting take on it.
29:52 I will pull out a few things that he mentions, and one is all the constants.
29:59 I guess I'd never counted them before, but there's five.
30:01 There's five constants in Python.
30:03 True, false, none, ellipsis, and not implemented.
30:08 I do like ellipsis.
30:09 We talked about that the other day, or I guess one or two weeks ago, using dot, dot, dot instead of pass.
30:15 - Are you gonna start doing that?
30:17 - I've already started doing that.
30:18 - Have you? I'm all about it.
30:19 I think I'm up for it as well.
30:20 - I don't, I guess I don't think I've ever used not implemented or even looked for it, but interesting discussion.
30:28 Also just liked, I liked looking around.
30:30 So here's a section on compile exec and eval.
30:33 It's not an alphabetical listing of everything.
30:35 It's a more grouping them together.
30:38 It's quite a big article, but I would suggest people just like skim through the list 'cause it's got a good table of contents at the top and you can just sort of skim through what he's talking about and pick a couple and go read about it.
30:52 You'll probably learn something.
30:53 So anyway, a good shout out to Tushar for writing this.
30:57 - Yeah, this looks super handy.
30:58 - Yeah, some of the built-ins are super handy.
31:01 I often have a Python REPL open just to do things that would otherwise be annoying to do on a calculator, like converting hex integers and vice versa.
31:11 There's a hex built-in, which is really helpful actually for doing this stuff. - Yeah.
31:15 I use hex a lot because I'm often looking at data elements in a packet or something like that and trying to convert those.
31:26 - Yeah, very nice, nice one.
31:28 Before we move on, Anthony, how do you feel about dot, dot, dot?
31:31 - They should have called it yada, yada, yada.
31:33 (laughing)
31:35 - Yeah. - I think that would be--
31:36 - It's way better than ellipses, come on.
31:38 - Yeah, I use it for type stubs and that's it.
31:41 So-- - Yeah.
31:43 There's times when you use pass, right?
31:44 And I feel like, you know what, dot, dot, dot kind of says, I kind of know, I'm not ready for that stuff here yet.
31:49 - I think we should start calling, instead of ellipses, we should call it dun dun dun.
31:54 (both laughing)
31:56 - Exactly.
31:57 All right, how about we hand out some awards?
32:00 - Okay.
32:00 - Best open source software of 2021.
32:03 Now, who gets to vote on this?
32:05 Who gets to say, well, InvoWorld in this example.
32:07 So this is according to InvoWorld, but there may be other rules, but I found this to be pretty interesting, actually.
32:12 I heard about it, learned about it, because Sebastian Ramirez from FastAPI said, "Yay, we've been voted one of the best open source projects." So this is called the InfoWorld Bossy 2021 Awards.
32:23 But what I thought was interesting is going through here, there was 30 different projects that won awards.
32:28 I'm like, "Oh, that's interesting.
32:29 "Oh, I didn't know about that.
32:30 "Oh, check this out, yeah." So I wanted to touch on a couple.
32:33 So there's some things that may or may not be interesting to you like Svelte, which is a JavaScript front end, like Vue or React, that's not interesting to me.
32:42 But Minikube, Minikube is pretty interesting.
32:45 Minikube is a way to run like a baby Kubernetes cluster right on your computer.
32:50 Just say Minikube start and guess what?
32:53 You've got a cool little cluster running.
32:54 So that might be really helpful for Python people.
32:57 Let's see, Pixie, gonna zoom back a little here.
33:00 Number five is FastAPI.
33:02 Now we're all fans of FastAPI.
33:05 I think it's really awesome that it won and worth maybe just giving a quick shout out to how they described it as Django and Flask have been leading the Python web frameworks for years.
33:13 FastAPI now deserves to be mentioned in the same breath.
33:16 I agree.
33:17 Calls out the main features, which are it's truly modern Python web framework written from the ground up using type hinting, async and high-speed components by default.
33:26 That's true.
33:27 And I also really liked that they pointed out that while its name indicates it's primarily for APIs, it's also really good at writing more conventional websites with like Jinja templates or even Chameleon templates.
33:39 So way to go.
33:40 Anthony, you wanna add it or Brian wanna add anything?
33:42 - Well, I just think that I think you're partly to thank for people considering FastAPI for not just APIs because you've been beating that drum a little bit as well.
33:51 - Yeah, thanks a bunch.
33:52 I even created some decorators that make it real easy to render templates as response values and stuff.
33:57 Yeah, it's fun.
33:58 Anthony?
33:59 - Yeah, I tried out the chameleon thing.
34:00 (laughing)
34:01 The one you wrote, actually.
34:03 Yeah, 'cause I'm working on this FastAPI course with you at the moment.
34:06 - Yeah, that's gonna be fun.
34:08 - So yeah, I'm a big fan of FastAPI.
34:10 I think it's brilliant and testament to Sebastian really, 'cause he really kind of builds on something which is quite complicated, but he makes it seem so effortless.
34:20 And just working with FastAPI, like the documentation is excellent.
34:25 The framework itself is just, is really logical.
34:28 And, you know, it's really easy to use.
34:30 There, in terms of like the, I've been keeping an eye on the popularity of the different frameworks and stuff over the last few years.
34:39 And Django and Flask are kind of neck and neck and have been for a while.
34:43 And FastAPI now is the third most popular according to the metrics that I've seen.
34:48 Yeah, out of nowhere to third most popular.
34:50 Yeah.
34:51 Yeah.
34:52 And I know JetBrains are doing the new, the latest PSF developer survey.
34:57 So yeah, we'll see kind of what happens in this year's number.
35:01 But I'd imagine FastAPI would still be the third most popular.
35:05 So yeah, it's pretty brilliant.
35:07 So yeah, I think it's a good solid pick.
35:10 In terms of writing like full apps with it at the moment, like there's still a lot you have to do for templating.
35:16 Like you pretty much have to like build in a whole bunch of other templating stuff and picking an ORM at the moment isn't easy, but there are some brilliant ones to have a play with.
35:27 - Yeah, there's a couple interesting ones.
35:28 - I wanna give a shout out to.
35:30 - Yeah, that give like similar even integrating with Pydantic, which is sort of the natural exchange of FastAPI.
35:36 So you want to give a shout out to Tortoise you say?
35:38 - Yeah, that's my favorite so far.
35:40 I've used, tried out six different ones so far.
35:42 (laughing)
35:43 - Yeah.
35:44 - And Tortoise I think is my favorite at the moment, so.
35:47 - Right on.
35:48 Well, maybe next year we'll be talking about the award for SQL Model, which is built on top of Identity plus SQLAlchemy by Sebastian as well.
35:56 So who knows?
35:56 A lot of good ones out there.
35:58 It's good to see a lot of the excitement and new ideas coming along there.
36:01 All right, what else we got?
36:02 Crystal, don't care.
36:04 Windows Terminal I think is actually pretty interesting.
36:06 Windows has traditionally been not on par with its terminal experience.
36:10 And I think, you know, the Windows Terminal, PowerShell 7, Oh My Posh, all these things come together, NerdFonts, to make it quite an amazing place to be actually.
36:19 - Windows Terminal is an open source project?
36:22 - It didn't start out that way, but now it is.
36:24 - Oh, okay.
36:25 - Yeah, yeah.
36:25 So that's a good one.
36:26 OBS Studio, if you're doing video stuff, that's amazing.
36:30 There's a bunch of stuff in here that may apply to people that you can all check out that are interesting, but I don't want to cover them.
36:36 Dask though, Dask is a big data science one, scale computation like pandas operations and what not across cores, across clusters, across compute that's larger than the RAM you have by streaming it off disk and all sorts of interesting stuff.
36:52 I have no idea why my browser is jumping up and down.
36:55 We'll have to ignore that.
36:56 I'm not in control of it, I'm sorry.
36:57 - It seems like-
36:58 (laughs)
36:59 - You know what, I'll tell you why this is happening.
37:01 I'm looking up and I see I'm not running my VPN which would block ads.
37:05 And so there's some kind of ad off the screen that's just running, and if I turn on my VPN, we'd be good.
37:11 All right, Blazing SQL is another great one.
37:13 Rapids from NVIDIA.
37:15 And I feel like there's one more I wanna give a shout out to.
37:17 Hugging Face, I don't know anything about that.
37:18 Now that was it.
37:19 So just going through that list, I thought it called out a lot of neat projects in addition to just FastAPI.
37:24 - Yeah, cool.
37:25 - Yeah, any of those jump out at you guys either that I've just screened by?
37:29 - Lots of stacks that I don't use.
37:32 - Yeah, same.
37:33 - Yeah.
37:34 - There was a bunch of ML stuff though, which I don't use, but I think would be relevant to people who are listening maybe.
37:40 - Well, we're not to extras yet, Michael.
37:41 - No, no, I know, I just closed it 'cause the jumping was driving me insane.
37:44 - Ah, okay.
37:45 - All right, Anthony, you got the last main one, right?
37:49 - All right, yeah, so I think Lukasz is taking up like half of this episode.
37:53 (both laughing)
37:55 So we're gonna get back to Lukasz's blog and evolve the discussion that was started last week on this-- - Very interesting discussion, Yeah, I'm, to put it mildly, I'm excited about this.
38:06 I think if this happens, it's probably going to be the biggest thing to happen in CPython in the last five years, in my opinion.
38:14 And this being the Gil removal.
38:16 This be the Gil removal.
38:17 But not the Gilectomy.
38:18 Not the Gilectomy.
38:19 Not exactly.
38:20 Yeah, so, no Gil or let's just go with no Gil.
38:27 Yeah, no Gil.
38:28 So almost seemingly out of nowhere, Sam Gross, who works at Facebook, basically submitted to the core developers this research paper and a working branch of a GIL-less Python.
38:46 And just quickly recap, I guess, on what that means.
38:49 This article is pretty heavy in technical detail and the stuff that's being discussed and the article, again, is pretty complicated. And I actually didn't understand a lot of it.
38:59 And I've written a book on the Python compiler. So if you read this and it's confusing, don't worry.
39:05 So the gil is basically the global interpreter lock. And it exists as a way of making Python thread safe when it comes to keeping reference counts of specific objects. So if you create a Python object, for example, there's a counter of how many things are referencing it, because you don't want to just destroy an object. And then, like, you're working through a list of objects, for example, but then one of the items in the list just disappears, has been deallocated.
39:39 Because everything is a pointer in Python. Like, that pointer just goes nowhere. Or actually, There's a magic pointer that Python uses when it deallocates objects, which I know from a very painful experience. So you don't want that to happen. And if you've got multiple threads kind of working with the same objects all at once, you don't want them to... It's incredibly hard to keep track of what's happening. Threading is great because you can have multiple threads working on a computer and the operating system can do the scheduling of which threads run on which cores and than which CPUs, et cetera.
40:16 So in theory, like it's a way of making your Python applications a lot faster if you write them to be multi-threaded, but Python's basically built in this lock, which says, okay, in the evaluation loop in CEVAL, don't let anyone else run a instruction whilst this thread is running the instruction.
40:36 - Yeah.
40:37 - With the exception of IOVAL tasks.
40:38 - Yeah, and it seems like this is a thing to control threading, and really it's just a thing to protect memory management, but it has this huge blocking effect for threading, right?
40:48 - Yeah, so it's the thing to basically make the reference counter thread safe.
40:52 - Without locking, so it's fast.
40:55 - Without locking, yeah.
40:56 So you don't have to wait to add an income.
40:59 So to give you an idea, like if you run the GC by hand, you'll just see how many tens of thousands of objects are just created like all the time in Python applications.
41:10 So what Sam had put together, I say seemingly out of nowhere, but if you go through the article and what he proposed, he's actually been working on this almost full time for two years, which is astonishing.
41:23 And it's a real feat of engineering, to be honest.
41:27 So kind of what he's proposed is a way of removing the GIL so that there's essentially like almost two ways of keeping references into objects.
41:39 And one of them is specific to the local thread.
41:44 And then there's also another reference count, which is for other threads.
41:48 So why is that important?
41:50 Well, let's say for example, you've got a Python dictionary with values in it, and then you have multiple threads all working on the same dictionary.
41:59 Like that's a complicated problem to solve.
42:01 Like how do you make sure that the keys, like the references to the keys or the values don't disappear?
42:09 And he does actually go into detail about how that's been handled.
42:12 And also objects like Python dictionaries are not thread safe at the moment either.
42:17 So, you know, if you have two threads working on a dictionary, adding values, for example, to a dictionary, do you have to lock the hash table?
42:26 Anyone who's worked with multi-threading in low level languages knows that like the complexities of doing it.
42:35 So what he's proposing is that, Well, in his prototype, he basically replaced the Python memory allocator with another one called Mimalloc, which is a sort of thread-safe memory allocator.
42:51 It's actually a Microsoft project, but I think it could have been any other thread-safe memory allocator.
42:58 Writing memory allocators is very involved for them to be performant and efficient.
43:06 And then basically objects get tied to the thread that created them.
43:10 And then there's a non-atomic local reference count with the owner thread.
43:15 And then there's basically a separate mechanism for what would be slower, basically reference counting from other threads.
43:21 So single threaded performance is equivalent with this proposal.
43:27 But when you're, there's still a performance impact of multiple threads working on the same object, which is to be expected.
43:34 Yeah, there's always a little overhead for that.
43:36 Yeah, but to give you an idea, in his note, he implemented a few common problems as a multi-threaded implementation.
43:45 And he said, if you give it 20 threads, it runs 19.84 times faster than it would in just regular CPython.
43:54 So for certain types of problems, this can have enormous impact in performance, but it is really complicated.
44:03 And that's why I think it's an interesting discussion to see, okay, how do we get from this is a cool idea to this actually being released and being used by, you know, millions of people and I don't know, Python's like running on like a satellites in space and stuff like, how do we go from a fork that someone's been hacking around with to something that's like production ready?
44:27 And this is kind of what the article goes into.
44:30 So like, you know, how would this work?
44:33 Would it be a feature flag?
44:36 which version would we target?
44:37 And so at the moment it's targeting 3.9 alpha three, actually, so it wasn't even the release of 3.9.
44:45 So he needs to do some work to update that to the latest version of 3.9, which is 3.9.7.
44:50 And then I think the target release, if the core developers agreed to kind of like explore this, if that was 3.11, or I don't think anyone wants to touch the Python 4 topic.
45:04 But 11 is like a year away.
45:08 Is that even possible or would it most likely be a couple of years out?
45:12 Yeah, it seems pretty soon to me.
45:13 And I like sub-interpreters, for example, is like an experimental feature.
45:18 I think the issue with this is that it's the volume of changes is so broad that it's quite hard to kind of like have it in as a feature toggle.
45:27 So like sub-interpreters was in as like a hidden package that you can use and it's experimental.
45:34 Because this is like changing everything.
45:36 Yeah, well, everything, but like, it's a pretty wide sweeping change.
45:42 And changing the memory allocator is a massive change.
45:45 So question is more, how can we introduce this softly, I think, and have it either as a feature flag?
45:54 And what would this break?
45:55 And the main thing is that C extensions haven't really had to worry about thread safety, because the GIL kind of handles that for them.
46:03 So C extensions essentially would need to, if they use the mechanisms that are here, that's fine.
46:09 But C extensions often have other objects which they haven't used the reference count for.
46:16 So they've basically kind of like allocated their own objects and variables and stuff like that, that would not be thread safe.
46:23 And they just not have had these kind of collision issues in the past.
46:27 So introducing this would then potentially break some C extensions.
46:31 So how could that be introduced gently?
46:34 I think what was interesting in the article is there's a mention of NumPy and NumPy has actually done a lot of its own work already on basically kind of making it thread safe and more scalable.
46:49 But one of the tricky ones is PyBind11 is called out in here as being anyone who's using PyBind 11 potentially might have to do some refactoring to support this if it was supported.
47:03 And then in closing, Lukasz, who wrote this review of posts, said, you know, the team had been really impressed with Sam's work and invited him to join CPython project as a core developer, and he's interested in Lukasz is going to mentor him.
47:18 So I think that's brilliant.
47:20 Oh, yeah, that's brilliant.
47:21 to come up with this over like even two years is like a really short amount of time for a problem that people have been trying to solve for well over a decade.
47:32 So yeah, very exciting.
47:33 Yeah, this is great.
47:34 I think we have a record number of core developers in the audience right now.
47:39 Yeah.
47:40 So some great comments from Steve Dower.
47:42 Hey, Steve.
47:43 The big thing needed here is a path forward for native extensions.
47:46 they could all need rewriting or else importing them could re-enable the GIL.
47:51 That discussion is happening now, it's very early.
47:53 And Henry Schreiner also has similar comments that they're considering that, but yeah.
47:58 And Henry also says, "We would be up for refactoring PyBind 11 if needed," I believe is also in this.
48:05 But this is exciting.
48:06 There's a lot of stuff coming here.
48:09 I think another thing in addition to the no-GIL is I got the sense that Sam had added several other optimizations that were independently worth adding to Python?
48:18 - Yeah. One of the things I know that there's a lot of tension around whether or not to do 4.0, but if it ends up being that all of the extensions need possibly tweaked, then that might be, then it's an API change, and I think a shift to 4.0 might not be terrible.
48:38 - It might be the right number, yeah. Well, we should just go to Python 5.0, So no one's worried about four and we'll skip the whole conversation. It'll be fine We're doing angular.js We'll just like and make a big fuss about going from one to two and then just just over something on like version 10 Oh, yeah, we'll just just go crazy. Yeah. Yeah, and that's fantastic I'm actually having you know been Rossum and Mark Shannon, I believe On on Monday on talk Python to talk about like performance in the future and stuff And I'm sure we'll talk about this stuff a little bit. Yeah, so it should be a lot of fun - This was Guido's suggestion when I asked internally if anyone wanted to share anything, this is what he sent over, so.
49:14 - Okay, fantastic, yeah, so I'll try to take that up with him again, all right.
49:17 Well, Brian, does that bring us to our extras?
49:20 - We are at extras, do you have any extras?
49:22 - Yeah, no, you go first, tell us about PyCon.
49:24 - Well, the call for proposals is open for US PyCon, I'm pretty excited about that.
49:30 I already wrote down like six ideas of things I might wanna talk about.
49:34 So, and of course, there's no guarantee, No matter who you are, there's no guarantee that you're gonna get in, but it's fun.
49:40 It's fun to come up with proposals anyway, and it's fun, I'm definitely going, so I'm pretty excited about that.
49:47 And anybody else gonna propose?
49:49 Anthony, you gonna try to talk there?
49:51 - Yeah, I've been thinking about that while I'm gonna put forward.
49:54 I wanna put together a talk on performance anti-patterns.
49:58 - Oh, that'd be fun.
50:00 - And then propose that for next year, yeah.
50:02 - Because of your name?
50:03 Like, anti-patterns?
50:05 (laughing)
50:07 - Also--
50:08 - We're not off to X section yet, Brian.
50:09 (laughing)
50:11 - If anybody doesn't know, I wrote a book and then I rewrote it and I'm finished with it actually.
50:19 So it's not out yet, but I'm pretty excited that I'm finished.
50:23 All the betas, there's beta seven out, has all chapters in it.
50:26 So if you're waiting for it to be done, it's done.
50:30 It's not in print form yet.
50:31 That's gonna happen in January or February.
50:33 So I'm pretty excited to get that done.
50:35 - I'm hoping for my copy at PyCon, Brian.
50:37 (laughing)
50:38 I'm pretty sure I paid for the last one as well.
50:40 I actually, I paid you in cash.
50:42 So I'm gonna give you a copy of my book.
50:44 - I'll bring, I'll bring at least--
50:45 - Maybe we can do a swap. - Swap, yeah.
50:48 That'd be great.
50:48 - Yeah, Anthony, I got your book over there.
50:50 I'm not sure what I can trade it for though.
50:52 (laughing)
50:53 No, that's awesome.
50:54 Congratulations, Brian.
50:55 - Thanks.
50:56 - Anthony, you got any extras you wanna share?
50:58 - Yeah, I'll be shipping fairly soon.
51:02 the JIT compiler that I've been working called Pigeon.
51:04 And I'll be going version one in two weeks.
51:09 So it's a Python 3.10 JIT compiler.
51:14 It's a, you basically just drop it into CPython and turn it on and then run your code and it just JIT compiles it in the background.
51:22 And in some cases makes it a lot faster and in other cases makes no difference.
51:26 (laughs)
51:28 But yeah, some of the benchmarks I've been doing like floating point math and integer math makes a massive difference.
51:37 So yeah, like 60%.
51:39 - Like the scientific side of thing, right?
51:41 - Yeah, so stuff that you would otherwise think, oh, I'm gonna redo this in Cython or something, like you don't have to add all the extra stuff.
51:50 You just kind of turn it on and yeah, the nBody benchmarks now 60% faster than standard CPython.
51:57 - That's great.
51:58 - And yeah, some of the other benchmarks like, well, 60% upwards.
52:01 - That's super cool.
52:02 So this work with Sam and the Nogill, does that throw a spinner in the works or is it a--
52:10 - It would make my life quite hard for a few weeks if it gets merged.
52:14 Yeah, so yeah, that could be interesting.
52:18 And I'm also working on a secret project, but I'll share that in a few weeks.
52:23 Yeah, Pigeon does, there's a comment in the chat, Pigeon does use Scikit-build, which I did want to call that out when we were talking about setup.py earlier, 'cause yeah, so Pidgin is all C++, and it uses CMake, which generates Makefiles.
52:41 So yeah, and it uses scikit-build, which is a CMake extension, I guess, around Python extension modules.
52:51 So that's how it kind of compiles.
52:52 It's really cool.
52:53 Big fan of scikit-build.
52:54 - Yeah, and I recommended using build earlier.
52:57 Henry on our episode together mentioned that if you have external non-Python code, like C code or Fortran or whatever, then instead of build scikit-build would be a good option to build the binary bits for that.
53:08 This is the other question I wanted to ask and Steve Dower beat me to it.
53:13 He states it as an assertion.
53:15 I was gonna ask you the question.
53:16 I bet once Pigeon ships, you'll get people interested in helping add optimization.
53:20 Yeah, so it's one thing to JIT compile.
53:22 It's another to just then straight up run it versus go, oh, we can inline this method.
53:26 and I see we can do this and then like, we could actually reuse this field because it's not used below and early free all that kind of stuff.
53:33 Where's the optimization of that one?
53:35 Yeah, I've got it like on the documentation page as a optimization section and I've kind of written up a lot of the optimizations and how they work, assertions that they make and compromises and stuff like that.
53:47 So yeah, if you're interested, there's this info on there.
53:50 But yeah, I'd love love more help on this.
53:53 The learning curve on the project is quite steep, but I'm trying to make it easier.
53:57 I mean, it is a compiler, so like, yeah.
54:02 And I just added ARM support as well.
54:03 So M1, Apple M1, and I tested Linux ARM 64 and in theory, Windows ARM, but I don't have access to any machines to test the Windows one.
54:16 And I could only test the Apple one remotely.
54:18 - If you need a periodic test, you can reach out.
54:20 I got a Windows 11 running on ARM.
54:23 - Oh, really?
54:24 Okay. - Yeah.
54:24 - Yeah, maybe I'll take you up on that.
54:25 - I know, very cool.
54:26 All right, I have a couple throughout there as well.
54:29 Python Software Foundation on Twitter, the PSF announces, "We're happy to announce "the Python Developer Survey 2021.
54:36 "Take part in it." This is the one that is then hosted and then the data analysis is done by JetBrains, but not influenced by JetBrains.
54:43 So I'll link to that in the show notes.
54:45 Be sure to get out there and take that.
54:47 Henry, out in the audience, I have something as well.
54:49 The feature for what you said the other day on Twitter.
54:52 I said, "After Python's bytes mentioned on yesterday's show, "I asked for a new feature and it's already in PipX.
55:00 "PipX run pypi command line wheels." And it basically, this is added to pypi command line.
55:08 And it'll tell you all sorts of cool stuff like the details of the wheel.
55:11 So you could run PipX, basically run pypi dash command dash line wheels, NumPy, however you run that, and it'll tell you like for NumPy on macOS 10 Universal, does it have a signature, is there a binary distribution, what versions are updated, supported, how old is it, how big is it?
55:29 Same thing for Linux architecture, ARM on Windows and so on, so on.
55:34 So you get like just this cool graph using Ridge of like tables of tables telling you about the status of wheels on different platforms straight out of PyPI, which I thought was cool.
55:44 - Nice.
55:45 - Yeah, so that's pretty good.
55:46 So Henry, thanks for making that happen.
55:48 Also on the last episode out on the YouTube, not live comments, we got a message from, I wanna make sure I get the attribution, from Bahram and said, we talked about, what is it?
56:00 - T-Bump.
56:01 - T-Bump, that was it, T-Bump for bumping the versions.
56:03 He said, "Oh, that's cool, I use bump to version," which is another option to do some similar types of things.
56:09 Could work with or without source control, all kinds of stuff, so fun one to check out.
56:14 And Brian, you sound really good this time.
56:18 Like last time I thought maybe a bee had gotten into your microphone.
56:21 What was the story of that?
56:23 - It's a long story.
56:24 Basically I had to throw a mic.
56:27 So I had a bad mic and a bad cable, but I have a new XLR cable.
56:30 - It's tough when the two things that are connected together are both broken at the same time.
56:35 - The buzzing I think was definitely my cable.
56:37 I think there was a feedback thing going on.
56:39 - You getting an SMS?
56:42 But then I was examining everything in my audio chain and I just got rid of the stuff that wasn't working.
56:50 - Yeah, you sound great.
56:51 New mics, even better than before.
56:53 So like a Phoenix, you're back.
56:55 - Nice image too.
56:57 - Yeah, and then have you got your Mac Pro yet?
57:00 - No, I just bought a Mac a couple years ago.
57:02 I'm not gonna buy another one right now.
57:04 - Anthony, are you using one of these to test your own version? - I don't know.
57:07 I don't have a spare $4,000.
57:09 - Yeah, it's not as bad as that.
57:10 - For another laptop.
57:12 And also, I was like, I don't really need a laptop 'cause I never leave the house, so like.
57:17 - Yeah, that is a big problem.
57:19 I mean, I am so loving my Mac mini and my 4K monitor that I'm just like, I don't wanna leave, I don't wanna leave.
57:24 All right, well, that's it for the extras.
57:26 I think it's time for a joke.
57:28 Maybe Robert's got the first one out there.
57:30 Can't complain about Brian, it's all about the hair.
57:32 You gotta see the livestream for that one.
57:34 But yeah, I agree with that.
57:35 - Next Halloween, I wanna go as Cousin It, so I got a ways to go.
57:39 Anthony, are you up for doing this joke?
57:41 Yeah, yeah, I got it on the, it's got on my screen.
57:45 Oh, you got it on yours?
57:46 Yeah, yeah, I'll do yours.
57:47 All right.
57:48 Okay, okay.
57:49 So I got it.
57:50 It's a picture.
57:51 So I'll have to describe it.
57:52 I couldn't stop laughing at this when I saw it.
57:54 So this is Frodo explaining to Gollum.
57:58 And there's Gollum sitting at a computer looking quite confused, looking at a picture of the ring.
58:03 And it says, "Buy now, one ETH." And as in Ethereum, right?
58:08 Yeah, yeah.
58:09 And Friar is basically trying to convince Gollum to buy an NFT of the ring instead of actually having the ring.
58:16 And underneath...
58:17 My precious, my digital precious.
58:19 So underneath it says, so you can't own the precious physically, but you can pay to have your name listed as its owner in an online distributed database.
58:29 It's only what is that like 400 US dollars, 500 Australian, something like that.
58:36 I know that's a lot for a listing.
58:38 I don't own any NFTs yet, nor have I sold any.
58:42 - I don't plan to either.
58:44 - Man, I feel like we're totally missing it.
58:46 We're missing an opportunity to brand some of our former episodes.
58:51 Maybe like, I could just take screenshots of Brian laughing at different times out of the live stream and then like turn it into a stream of NFTs that we'll retire upon.
59:00 - Oh yeah, let's do that.
59:02 Yeah.
59:04 - Oh, fantastic.
59:06 All right, oh, that was a good one.
59:07 Thanks, Anthony.
59:08 And thanks for being here on this big episode 256.
59:13 - Yeah, I feel like we've maybe gone slightly over this.
59:15 This is not really a Python bite this week.
59:17 It's more of a Python lunch, I think.
59:19 - Sandwich, eating some chips.
59:22 - Yeah, it's a proper meal, a Python dinner.
59:23 But it was a good one.
59:24 We talked about a lot of stuff.
59:25 And a bunch of great people in the audience gave us really good inside information on where things are going.
59:30 So thank you for being here.
59:31 - Yeah, so thanks everyone.
59:32 - Hello to everyone in the audience.
59:33 - Yeah, thanks, Brian.
59:34 Yeah, all right.
59:34 Bye, y'all.