00:00:00.020 --> 00:00:04.620
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:00:05.380 --> 00:00:07.600
This is episode 500,
00:00:08.240 --> 00:00:09.980
recorded October 13th,
00:00:10.260 --> 00:00:11.160
2026.
00:00:11.540 --> 00:00:12.560
I'm Michael Kennedy.
00:00:12.960 --> 00:00:13.860
And I'm Calvin Hendryx-Parker.
00:00:14.300 --> 00:00:15.120
I'm Nick Muoh.
00:00:15.480 --> 00:00:16.059
I'm Brett Cannon.
00:00:16.420 --> 00:00:19.800
I'm Carol Willing, and I sometimes pretend I'm Brett Cannon.
00:00:20.140 --> 00:00:21.660
And I have no problems being Carol either,
00:00:21.820 --> 00:00:22.420
so there you go.
00:00:22.660 --> 00:00:22.940
Everyone,
00:00:23.160 --> 00:00:25.000
thank you so much for being here for this special episode.
00:00:25.700 --> 00:00:26.580
Sign up to the newsletter,
00:00:26.880 --> 00:00:29.800
social links, all that kind of stuff is at the top of the show notes.
00:00:29.980 --> 00:00:31.740
So let's just go ahead and kick this off.
00:00:31.980 --> 00:00:34.560
We've got a really awesome, almost 10 years.
00:00:34.650 --> 00:00:36.200
I don't know if this is exactly 10 years or not,
00:00:36.380 --> 00:00:37.560
but almost 10 years.
00:00:37.740 --> 00:00:40.420
Certainly episode 500 is quite a thing.
00:00:40.760 --> 00:00:42.400
So Python Bytes has been around a long time.
00:00:42.680 --> 00:00:45.620
All of y'all have been here before in various ways.
00:00:46.180 --> 00:00:49.940
The one big missing component here, the person we're missing is Brian Okken.
00:00:50.420 --> 00:00:51.320
But don't worry,
00:00:51.700 --> 00:00:52.500
Brian was supposed to be here.
00:00:52.640 --> 00:00:53.120
Something came up,
00:00:53.320 --> 00:00:53.640
couldn't make it.
00:00:53.780 --> 00:00:57.900
So Calvin and I had a quick chat with him before and we'll splice that in.
00:00:57.980 --> 00:00:59.960
So we're going to be hearing that in just a little bit.
00:01:00.500 --> 00:01:00.680
Welcome,
00:01:00.920 --> 00:01:01.000
everyone.
00:01:01.360 --> 00:01:03.240
Thank you for taking the time to celebrate this milestone.
00:01:03.640 --> 00:01:03.880
Calvin,
00:01:04.420 --> 00:01:05.680
thanks for being here to keep it going.
00:01:06.040 --> 00:01:06.380
Love it.
00:01:06.480 --> 00:01:08.100
I'm glad to be the new co-host.
00:01:08.220 --> 00:01:10.580
And I'm excited for this crew for the 500 episode.
00:01:11.060 --> 00:01:14.880
And congratulations to all of you for getting us all the way to here.
00:01:15.260 --> 00:01:16.680
Thanks for calling us old, Brent.
00:01:16.780 --> 00:01:17.240
Appreciate it.
00:01:17.920 --> 00:01:18.820
No, I really do appreciate it.
00:01:18.820 --> 00:01:19.420
I'm just kidding, man.
00:01:19.420 --> 00:01:21.960
A person who's been doing Python was probably the, I think,
00:01:22.180 --> 00:01:25.160
at least officially the longest maybe on this call.
00:01:25.160 --> 00:01:26.440
I don't know, Caroline, I can duke it out.
00:01:27.100 --> 00:01:28.780
2000 when I started using Python.
00:01:29.240 --> 00:01:29.340
Oh,
00:01:29.540 --> 00:01:29.740
all right.
00:01:29.960 --> 00:01:30.420
Calvin wins.
00:01:30.860 --> 00:01:31.040
No,
00:01:31.260 --> 00:01:31.860
go Calvin.
00:01:32.460 --> 00:01:33.000
That's an accomplishment.
00:01:33.020 --> 00:01:33.180
Wait,
00:01:33.400 --> 00:01:33.480
no.
00:01:33.840 --> 00:01:34.500
Win in 2000.
00:01:34.600 --> 00:01:35.720
I started in 2000 as well.
00:01:36.040 --> 00:01:41.080
So it would have been early 2000, so probably like a February or March.
00:01:41.560 --> 00:01:41.980
You beat me.
00:01:42.140 --> 00:01:42.760
I started in fall.
00:01:43.180 --> 00:01:43.360
Okay.
00:01:44.660 --> 00:01:44.980
Wow.
00:01:45.120 --> 00:01:45.360
All right.
00:01:45.520 --> 00:01:46.500
Wow, that's crazy.
00:01:46.540 --> 00:01:48.080
Now we've established the pecking order.
00:01:48.260 --> 00:01:51.340
I'm sure I sit above Brett for most things.
00:01:52.280 --> 00:01:53.300
I'm not in the Python world.
00:01:53.760 --> 00:01:54.060
Amazing.
00:01:54.600 --> 00:01:57.280
Calvin, I was just thinking as I was getting ready for this show,
00:01:57.460 --> 00:01:59.160
we're on almost month
00:01:59.440 --> 00:01:59.620
four,
00:02:00.010 --> 00:02:02.640
if not past it, of you and I hosting the show together.
00:02:02.670 --> 00:02:03.580
It feels like we just started,
00:02:03.800 --> 00:02:04.720
but thanks for being here as well.
00:02:04.760 --> 00:02:05.220
It's been great.
00:02:05.370 --> 00:02:07.000
I really enjoyed jumping in.
00:02:07.160 --> 00:02:11.760
And this has been kind of a passion for me, a future dream that I thought would never
00:02:11.830 --> 00:02:12.140
come true.
00:02:12.210 --> 00:02:12.760
And here I am.
00:02:12.930 --> 00:02:13.320
I love it.
00:02:13.480 --> 00:02:13.800
Thank you, Michael.
00:02:14.260 --> 00:02:15.860
Yeah, it's awesome to be here with you as well.
00:02:16.420 --> 00:02:16.740
And now,
00:02:16.920 --> 00:02:17.520
like I said before,
00:02:17.800 --> 00:02:19.900
Brian wasn't able to join us in real time,
00:02:20.180 --> 00:02:21.400
but Calvin and I
00:02:21.340 --> 00:02:24.860
got the chance to speak with him beforehand to make sure he was part of the show.
00:02:25.200 --> 00:02:25.740
Let's have
00:02:25.880 --> 00:02:26.940
that conversation with Brian.
00:02:27.660 --> 00:02:28.260
Oh my goodness.
00:02:28.500 --> 00:02:30.920
It is Brian Okken. Thank you for joining us for the
00:02:31.020 --> 00:02:31.600
500 episode.
00:02:32.000 --> 00:02:32.960
Blast from the past.
00:02:33.280 --> 00:02:34.400
Brian Okken. Yeah,
00:02:34.620 --> 00:02:34.780
man.
00:02:35.060 --> 00:02:36.080
It's definitely a blast from the past.
00:02:36.080 --> 00:02:37.080
It's good to have you back in the show.
00:02:37.480 --> 00:02:37.780
500.
00:02:38.040 --> 00:02:39.060
That's a big number,
00:02:39.220 --> 00:02:39.320
man.
00:02:39.480 --> 00:02:40.740
And a lot's happened
00:02:40.900 --> 00:02:42.260
since you left.
00:02:42.480 --> 00:02:43.420
You published a book.
00:02:43.640 --> 00:02:44.360
I did.
00:02:44.580 --> 00:02:46.200
It's right there.
00:02:46.380 --> 00:02:46.520
Yes,
00:02:46.700 --> 00:02:47.120
it is.
00:02:47.460 --> 00:02:48.060
Lean TDD.
00:02:48.280 --> 00:02:48.959
We have the
00:02:48.980 --> 00:02:56.060
number one lean tdd author of for the pipe for the python bytes list and it may be the biggest
00:02:56.340 --> 00:03:00.960
new release of test driven development book in august of last of this year i don't know
00:03:02.820 --> 00:03:07.720
yes very very no no honestly it's it's a very good book and you and i we just got back from
00:03:08.080 --> 00:03:12.920
hanging out in san francisco together of all the things we ironically just randomly stayed at the
00:03:13.060 --> 00:03:18.940
same hotel for yeah it was it was actually kind of surreal we spent so michael and i um live in
00:03:18.960 --> 00:03:20.200
or near Portland.
00:03:20.600 --> 00:03:23.700
And we usually see each other at conferences somewhere else.
00:03:24.960 --> 00:03:25.700
You know what it is?
00:03:25.840 --> 00:03:26.560
It's so weird.
00:03:26.740 --> 00:03:27.940
I have so many friends like that.
00:03:28.100 --> 00:03:30.300
And it's because you don't have family.
00:03:30.510 --> 00:03:31.320
You don't have the kids.
00:03:31.390 --> 00:03:32.640
You don't have all this, you know,
00:03:32.890 --> 00:03:34.060
you could just kind of hang out and do whatever.
00:03:34.640 --> 00:03:35.360
Conferences are awesome.
00:03:35.530 --> 00:03:36.640
I think conferences are awesome.
00:03:36.940 --> 00:03:39.200
I mean, that's how I met most of you all
00:03:39.370 --> 00:03:41.280
is because of going to great Python conferences.
00:03:42.180 --> 00:03:42.360
Yeah.
00:03:42.660 --> 00:03:43.340
And Calvin,
00:03:43.760 --> 00:03:43.840
yeah,
00:03:44.140 --> 00:03:45.260
that Python party,
00:03:45.540 --> 00:03:45.680
man,
00:03:45.690 --> 00:03:47.400
it was the most epic party I've ever been to.
00:03:47.620 --> 00:03:48.520
So it was good.
00:03:48.760 --> 00:03:54.060
which one you're talking you're talking about select city yeah that was a really good one yeah
00:03:54.310 --> 00:03:58.260
the one that took over the top of the top of the bit the top of the top of the video
00:03:59.060 --> 00:04:05.860
no it was good plus i met um like on his name the brown bag guy um oh chris williams yeah yeah chris
00:04:05.940 --> 00:04:09.900
williams was there i mean we had charlie marsh there we had brett actually who's on the show
00:04:10.180 --> 00:04:15.460
was there so yeah he was really good yeah yeah and all and all those a lot of a lot of people
00:04:15.480 --> 00:04:22.180
had just started their um like startups that are going fantastic yeah yeah that was the rust wave
00:04:22.620 --> 00:04:28.300
we haven't really seen the ai wave party yet yeah it's the it no the ai wave is waving people
00:04:28.500 --> 00:04:34.400
goodbye when they get laid off because of it no well you know what seriously though we were just
00:04:34.540 --> 00:04:39.600
both in san francisco were you blown away at how many billboards were about ai that was weird things
00:04:39.660 --> 00:04:45.180
it was like going into a like a sci-fi futuristic movie or something it was well like because there
00:04:45.420 --> 00:04:50.500
wasn't anything else there was it took over the like i'm not sure i'm i mean i'm glad there weren't
00:04:50.560 --> 00:04:57.580
like cigarette billboards and alcohol billboards and and or like right you know the dispensary
00:04:57.780 --> 00:05:05.460
billboards divorce lawyers but having it all be like targeted towards stuff that uh just as i i
00:05:05.460 --> 00:05:11.260
still think it's a small percentage um uh ai is changing a lot but it's um it is sort of it's a
00:05:11.480 --> 00:05:16.960
kind of a middle upper middle class and higher sort of a phenomenon i don't i don't know if it's
00:05:17.120 --> 00:05:23.740
affecting everybody really other than it's taken over your search window anyway um yeah i i had a
00:05:23.960 --> 00:05:28.120
airport i had a ride to the airport i don't know maybe 25 minutes or something like that i mean
00:05:28.260 --> 00:05:31.560
in san francisco it could be three hours or it could be 10 minutes depending on the traffic but
00:05:31.580 --> 00:05:32.980
It was, I think, 25 minutes.
00:05:33.260 --> 00:05:35.080
And I think it was full of billboards.
00:05:35.190 --> 00:05:40.140
I think literally every single billboard I saw, at least that I noticed, was some kind of, if not AI,
00:05:40.360 --> 00:05:41.000
AI adjacent.
00:05:41.500 --> 00:05:44.940
Or there's all these companies that are like, yeah, we're the AI markdown editor.
00:05:45.120 --> 00:05:46.860
Like, you were just a markdown editor last year.
00:05:46.980 --> 00:05:47.420
Come on now.
00:05:47.630 --> 00:05:48.040
You know what I mean?
00:05:48.060 --> 00:05:49.260
Like that kind of thing as well.
00:05:49.400 --> 00:05:50.040
I don't get why.
00:05:50.140 --> 00:05:51.140
Who are they trying to convince?
00:05:52.200 --> 00:05:52.560
Investors.
00:05:52.960 --> 00:05:54.320
I think they're trying to convince investors.
00:05:54.480 --> 00:05:57.840
Anyone who's involved in this hype right now is raising money.
00:05:58.160 --> 00:05:58.380
Yeah.
00:05:58.590 --> 00:05:58.940
I don't know.
00:05:59.040 --> 00:06:02.800
How does your framework desktop in the basement feel about this,
00:06:02.960 --> 00:06:03.080
Colin?
00:06:03.540 --> 00:06:04.500
He's fine. He's right over here.
00:06:05.360 --> 00:06:07.040
He's on the standing desk over here.
00:06:07.570 --> 00:06:09.600
The local models are running just fine.
00:06:09.960 --> 00:06:10.520
A little hiccup.
00:06:10.910 --> 00:06:12.820
So I use it with Home Assistant in the house,
00:06:13.200 --> 00:06:16.360
which is another fine Python project that everyone should go check out.
00:06:16.760 --> 00:06:18.600
And you got a little confused this morning
00:06:18.940 --> 00:06:21.100
and thought that it couldn't control the home.
00:06:21.210 --> 00:06:23.540
Like I was using Qwen 3.8 27B,
00:06:23.750 --> 00:06:26.020
the one that's kind of all over the news today.
00:06:26.600 --> 00:06:29.560
And I just kind of forgot that it could actually control stuff.
00:06:29.940 --> 00:06:33.460
Maybe that's a good direction to go versus like take over all the things.
00:06:33.860 --> 00:06:34.900
But it does work.
00:06:35.080 --> 00:06:35.560
Works really well.
00:06:35.740 --> 00:06:35.980
Yeah.
00:06:36.220 --> 00:06:36.400
Awesome.
00:06:36.740 --> 00:06:36.820
Yeah.
00:06:36.820 --> 00:06:40.740
We got to get used to a non-deterministic world where like stuff just, it used to work yesterday.
00:06:40.940 --> 00:06:42.360
Now it doesn't necessarily work.
00:06:42.440 --> 00:06:43.880
Well, what's nice is you can have a discussion.
00:06:44.290 --> 00:06:46.240
Like I've got the home assistant voice set up.
00:06:46.450 --> 00:06:50.640
And so you can actually talk back and forth with the little box on the desk as opposed to kind of,
00:06:50.920 --> 00:06:56.240
I don't know, I won't utter the Amazon version of that box because it'll start going off.
00:06:56.460 --> 00:06:58.500
but you can't really have a discussion with those boxes,
00:06:58.580 --> 00:07:00.140
but you can have a discussion with Quinn 38.
00:07:00.480 --> 00:07:00.840
Oh, really?
00:07:01.220 --> 00:07:01.360
Yeah.
00:07:02.760 --> 00:07:03.500
You can go back and forth.
00:07:03.600 --> 00:07:04.380
I can interrupt it.
00:07:04.500 --> 00:07:04.880
I can,
00:07:05.120 --> 00:07:06.160
you know, it's all sitting on my desk,
00:07:06.360 --> 00:07:09.040
but just the satellite one dev board,
00:07:09.440 --> 00:07:11.080
which is getting a 1.1 release
00:07:11.780 --> 00:07:13.860
and their pre-orders are open now.
00:07:14.320 --> 00:07:15.660
So you're talking to it?
00:07:15.840 --> 00:07:16.460
I'm talking to it.
00:07:16.640 --> 00:07:17.280
Talking to my home assistant.
00:07:17.620 --> 00:07:17.820
Okay.
00:07:18.180 --> 00:07:18.820
Do you have arguments?
00:07:19.280 --> 00:07:19.600
All local.
00:07:20.880 --> 00:07:24.759
So it precedes like a prompt into the model
00:07:25.100 --> 00:07:29.120
and it precedes all of the devices that are in your home
00:07:29.520 --> 00:07:30.380
that home assistant knows
00:07:30.900 --> 00:07:33.200
with a preference for a specific room you're in.
00:07:33.320 --> 00:07:34.080
So if I'm in the study
00:07:34.460 --> 00:07:36.720
and the home assistant voice box is in the study,
00:07:36.780 --> 00:07:37.820
I've told it it's in the study,
00:07:38.240 --> 00:07:39.400
I can just say, turn off the lights
00:07:39.680 --> 00:07:40.660
and it knows it's in the study.
00:07:40.760 --> 00:07:41.420
There's lights in the study
00:07:41.460 --> 00:07:42.280
and it turns off the lights.
00:07:42.639 --> 00:07:42.960
Interesting.
00:07:43.780 --> 00:07:43.860
Yeah.
00:07:44.140 --> 00:07:44.640
That is clever.
00:07:44.760 --> 00:07:45.880
Here I'm back in the dark ages.
00:07:46.020 --> 00:07:47.900
I like go over to the wall and push a button.
00:07:48.120 --> 00:07:48.440
A wall?
00:07:49.660 --> 00:07:50.720
You could hurt your finger doing that.
00:07:50.820 --> 00:07:51.120
Don't do that.
00:07:52.080 --> 00:07:52.560
Touch that.
00:07:52.760 --> 00:07:54.380
They're conveniently located though.
00:07:54.600 --> 00:07:55.760
I mean, it's designed well.
00:07:55.920 --> 00:07:59.880
So the place where I enter the room is where the switch is.
00:08:00.900 --> 00:08:02.480
It's got incredible technology.
00:08:03.199 --> 00:08:04.160
It's kind of nice.
00:08:05.379 --> 00:08:06.800
Yeah, I just added it into the air.
00:08:07.060 --> 00:08:09.920
What happens when the Wi-Fi goes down?
00:08:10.999 --> 00:08:12.580
Well, that's on battery backup.
00:08:13.120 --> 00:08:15.020
And the Internet's not required.
00:08:15.760 --> 00:08:17.020
All the access points are PoE.
00:08:17.440 --> 00:08:18.660
There's a big battery in the basement,
00:08:19.320 --> 00:08:20.240
hooked up to the home assistant.
00:08:20.720 --> 00:08:21.440
It's all central.
00:08:21.700 --> 00:08:22.860
There's a battery up here on the framework.
00:08:23.460 --> 00:08:26.620
So I can last a couple hours without any Wi-Fi,
00:08:27.160 --> 00:08:27.260
internet,
00:08:27.500 --> 00:08:29.220
or power and still talk to my house.
00:08:29.520 --> 00:08:29.660
Okay,
00:08:30.120 --> 00:08:30.320
nice.
00:08:31.040 --> 00:08:33.740
I talk to my house too, but it just doesn't talk back.
00:08:34.340 --> 00:08:35.159
Mine can talk back.
00:08:35.880 --> 00:08:38.860
Hey, I wanted to say just thank you for stepping in.
00:08:40.759 --> 00:08:44.680
So I sort of just jumped out of Python Bytes without letting people know.
00:08:45.060 --> 00:08:46.460
And there was no hard feelings or anything.
00:08:46.660 --> 00:08:48.340
Michael and I are definitely still friends.
00:08:48.660 --> 00:08:49.560
He didn't kick me out.
00:08:50.580 --> 00:08:54.820
But it was this book and also my day job is pretty exciting.
00:08:55.140 --> 00:08:57.860
So I just sort of wanted to do other stuff.
00:08:58.520 --> 00:09:03.080
I really enjoyed Python Bytes and I'm glad it's not stopped just because I've stopped.
00:09:03.200 --> 00:09:05.480
I really enjoyed doing it.
00:09:05.580 --> 00:09:06.820
You had a great run.
00:09:06.900 --> 00:09:08.020
I mean, how many episodes,
00:09:08.480 --> 00:09:11.360
10 years nearly of Brian's voice in my earbuds.
00:09:12.060 --> 00:09:15.420
And now my Python Bytes, I'm like, oh, that's my voice.
00:09:15.960 --> 00:09:19.300
It was funny when I was watching PyBay.
00:09:19.560 --> 00:09:22.840
I was in the audience waiting for Michael Kennedy.
00:09:22.920 --> 00:09:23.720
I sat down right now.
00:09:24.400 --> 00:09:25.220
I kind of entered late.
00:09:25.500 --> 00:09:26.160
Sorry about that, Michael.
00:09:26.440 --> 00:09:27.280
But sat down,
00:09:27.520 --> 00:09:28.260
and he's up there.
00:09:28.260 --> 00:09:29.120
And I said, oh,
00:09:29.440 --> 00:09:30.320
that guy's kind of famous.
00:09:31.980 --> 00:09:35.900
And the person sitting next to me turned around and said, yeah, you're kind of famous too,
00:09:36.100 --> 00:09:36.240
man.
00:09:37.399 --> 00:09:38.320
So I'm like,
00:09:38.520 --> 00:09:39.700
no, not like Michael famous.
00:09:41.480 --> 00:09:42.240
Thanks for coming to talk.
00:09:42.260 --> 00:09:45.320
And your talk on Lean TD was really, really good.
00:09:45.720 --> 00:09:47.480
I think people really appreciated it as well.
00:09:47.520 --> 00:09:48.300
I'm waiting for that.
00:09:48.720 --> 00:09:51.600
One of the fun things about it is I got to talk about my career.
00:09:52.060 --> 00:09:52.660
So I,
00:09:53.060 --> 00:09:55.280
well, I didn't get to, I decided to.
00:09:55.460 --> 00:09:56.180
So the first few,
00:09:56.380 --> 00:09:57.620
like maybe five minutes of the talk
00:09:57.840 --> 00:10:00.720
are discussing my career in test and measurement,
00:10:00.980 --> 00:10:01.720
the RF world.
00:10:01.940 --> 00:10:02.380
That was fun.
00:10:02.540 --> 00:10:06.340
Yeah, if you want Brian's full story leading up to Lean TDD,
00:10:06.819 --> 00:10:08.820
eventually the videos for those talks should be out.
00:10:09.080 --> 00:10:12.340
And I do look forward to coming back for Python Byte's
00:10:12.920 --> 00:10:14.260
1,000th episode as well.
00:10:14.640 --> 00:10:14.740
Nice.
00:10:16.100 --> 00:10:16.240
Oh,
00:10:16.420 --> 00:10:16.480
yeah,
00:10:16.720 --> 00:10:16.860
yeah.
00:10:17.020 --> 00:10:18.980
We're going to have to start doing more than one episode.
00:10:19.900 --> 00:10:20.340
On the decade.
00:10:20.720 --> 00:10:21.480
No, I'm sure,
00:10:21.700 --> 00:10:21.900
honestly.
00:10:22.780 --> 00:10:23.780
It's very possible,
00:10:23.980 --> 00:10:24.860
which is very insane,
00:10:25.020 --> 00:10:25.140
honestly.
00:10:27.500 --> 00:10:30.580
Let's wrap this part out, this section out with just,
00:10:30.740 --> 00:10:32.220
we can maybe each look back.
00:10:32.480 --> 00:10:34.000
Think back to an innocent time.
00:10:34.440 --> 00:10:36.780
AI was a thing we made fun of because it was bad.
00:10:36.940 --> 00:10:37.640
There was no COVID,
00:10:37.940 --> 00:10:38.600
none of this stuff.
00:10:39.020 --> 00:10:40.180
Back to 2016,
00:10:40.640 --> 00:10:41.960
2017 when we started this.
00:10:42.459 --> 00:10:45.320
What's something notable that you all have seen change?
00:10:45.640 --> 00:10:46.740
I'll give you the final word.
00:10:46.800 --> 00:10:47.480
So Calvin,
00:10:47.680 --> 00:10:49.300
something from 2016,
00:10:49.600 --> 00:10:49.820
17,
00:10:50.000 --> 00:10:51.860
that era that really stands out for you.
00:10:52.399 --> 00:10:53.860
So anything from 2016,
00:10:54.020 --> 00:10:54.340
2017,
00:10:54.660 --> 00:10:55.240
around that time
00:10:55.660 --> 00:10:56.860
when you all started the podcast,
00:10:57.160 --> 00:10:58.980
I think the biggest thing that's changed for me
00:10:59.000 --> 00:11:01.320
has been packaging gotten way more sane.
00:11:01.620 --> 00:11:03.020
So I'm super excited about that.
00:11:03.400 --> 00:11:04.220
And the community is still here.
00:11:05.080 --> 00:11:06.040
PyCon still goes strong,
00:11:06.840 --> 00:11:09.220
even though we had a few years in there of weirdness
00:11:10.020 --> 00:11:10.660
around the world.
00:11:11.000 --> 00:11:12.040
And so I'm glad we're all still here.
00:11:12.260 --> 00:11:12.460
Yeah,
00:11:12.800 --> 00:11:14.100
packaging has absolutely changed.
00:11:14.440 --> 00:11:15.600
It still has a little ways to go.
00:11:15.760 --> 00:11:16.160
Way better.
00:11:16.160 --> 00:11:16.600
But what was it better?
00:11:16.680 --> 00:11:22.020
I'm still waiting for Python --build --arm my file someday.
00:11:22.460 --> 00:11:22.560
Right.
00:11:22.760 --> 00:11:22.960
The,
00:11:23.280 --> 00:11:23.340
the,
00:11:23.550 --> 00:11:23.960
a couple,
00:11:24.120 --> 00:11:24.760
there's a lot of stuff,
00:11:24.960 --> 00:11:27.840
but of course we don't really talk about Python
00:11:28.080 --> 00:11:28.880
two seven anymore,
00:11:29.280 --> 00:11:29.820
which is nice.
00:11:30.120 --> 00:11:30.320
Um,
00:11:30.530 --> 00:11:30.640
um,
00:11:30.900 --> 00:11:32.780
it's just gone or,
00:11:33.020 --> 00:11:33.440
you know, hopefully,
00:11:33.940 --> 00:11:35.880
and we'll get comments that people are saying
00:11:35.960 --> 00:11:37.480
like, I still have to deal with it, man.
00:11:37.960 --> 00:11:39.860
I'm sorry if you still have to deal with it.
00:11:40.110 --> 00:11:40.240
Uh,
00:11:40.560 --> 00:11:42.600
the other thing, packaging is a huge thing.
00:11:42.660 --> 00:11:43.060
I was just,
00:11:43.240 --> 00:11:44.900
I did,
00:11:45.160 --> 00:11:47.720
I've been updating a Python plugin or pytest plugin,
00:11:48.160 --> 00:11:49.540
pytest check recently.
00:11:50.100 --> 00:11:53.280
And the release process is push a tag.
00:11:54.080 --> 00:11:55.000
And then this,
00:11:55.400 --> 00:11:56.180
it's because it's this,
00:11:56.790 --> 00:12:00.600
the server builds it and talks with PyPI and does that.
00:12:00.670 --> 00:12:04.600
And I don't have to use Twine anymore by myself or anything like that.
00:12:04.670 --> 00:12:05.200
And the package,
00:12:05.520 --> 00:12:05.620
like,
00:12:05.800 --> 00:12:08.200
I'll have to just, I guess I'm marrying Calvin.
00:12:08.680 --> 00:12:11.100
The packaging system is something,
00:12:11.280 --> 00:12:13.140
it's so easy now that I don't think about it.
00:12:13.360 --> 00:12:15.780
Once I get it set up for a project, I just don't think about it.
00:12:16.300 --> 00:12:17.960
Yeah, and Nox and Tox.
00:12:18.450 --> 00:12:18.800
Oh, I still,
00:12:19.020 --> 00:12:19.300
yeah,
00:12:19.560 --> 00:12:20.240
Tox is great.
00:12:20.330 --> 00:12:20.880
I like Tox.
00:12:21.260 --> 00:12:22.540
We're just not left unsupervised.
00:12:23.480 --> 00:12:23.920
Unsupervised.
00:12:24.480 --> 00:12:29.460
Well, I was going to say, the thing that I was going to add is the two versus three wars
00:12:29.900 --> 00:12:31.440
and how many of us survived.
00:12:31.960 --> 00:12:32.560
But honestly,
00:12:32.780 --> 00:12:36.240
if you weren't around in that time or you weren't working in Python at the time,
00:12:36.460 --> 00:12:43.480
It was a long drawn out period where it was not entirely clear that Python was ever going to make it to Python 3.
00:12:43.640 --> 00:12:46.240
And then it would be permanently stuck in an older way.
00:12:46.540 --> 00:12:49.980
It was more shaky than I think people give it credit for being.
00:12:50.060 --> 00:12:54.260
And also, we just made a change that would have made the 2 to 3 transition easier.
00:12:54.600 --> 00:12:56.320
The making UTF-8 default.
00:12:56.820 --> 00:12:58.840
That should have been from the start.
00:12:58.960 --> 00:13:00.540
Just say it would have been a lot easier.
00:13:02.040 --> 00:13:04.140
So many cannot decode exceptions.
00:13:06.080 --> 00:13:08.360
Yeah, I was going to pick the two to three wars as well,
00:13:08.560 --> 00:13:09.900
but as a joke, of course.
00:13:09.950 --> 00:13:11.320
But honestly, that was a serious,
00:13:11.500 --> 00:13:12.100
serious thing.
00:13:12.290 --> 00:13:13.520
But I think I'll go for performance.
00:13:14.040 --> 00:13:15.400
Python has got a lot faster.
00:13:15.820 --> 00:13:21.640
The Python 310 Foundation and 311 especially made it quite a bit faster.
00:13:22.540 --> 00:13:23.240
And, you know,
00:13:23.440 --> 00:13:25.000
there's still continues today.
00:13:25.480 --> 00:13:26.720
There was a lot of, well, Python's too slow.
00:13:26.720 --> 00:13:30.220
We can't choose this for our project because obviously we got to use Go
00:13:30.470 --> 00:13:34.000
because that was the hot thing at the time before Rust really kicked into gear
00:13:34.330 --> 00:13:35.660
because we need better async.
00:13:35.840 --> 00:13:41.920
need faster x y and z and i think it's it's come a long way uh one final thing uh the or at least
00:13:41.920 --> 00:13:49.960
for me the um is that uh py test isn't considered niche anymore um it's uh pretty it's pretty obvious
00:13:50.050 --> 00:13:55.040
that people go with py test it's you don't have to defend it anymore which is cool and there was
00:13:55.040 --> 00:13:59.860
a book that probably helped maybe yeah who knows a couple couple books well i just want to take
00:14:00.240 --> 00:14:05.800
before before we wrap it up brian i just want to say you know thank you for 10 years of hard work
00:14:05.820 --> 00:14:09.980
People from the outside are like, oh, we just jump on for like 20 minutes or sometimes an hour.
00:14:10.100 --> 00:14:10.700
Then you get complaints.
00:14:10.740 --> 00:14:11.640
And it goes back to 20 minutes.
00:14:12.240 --> 00:14:14.360
No, you just jump on for a while and you have a quick chat.
00:14:14.420 --> 00:14:19.100
And there's so much behind the scenes that takes a lot of work to put this show together and keep it flowing.
00:14:19.720 --> 00:14:19.760
Yeah.
00:14:20.000 --> 00:14:20.600
Thanks for the hard work.
00:14:21.000 --> 00:14:21.400
Oh, you bet.
00:14:21.560 --> 00:14:21.780
Thank you.
00:14:22.640 --> 00:14:23.280
And yeah,
00:14:23.440 --> 00:14:24.420
thank you for keeping it going.
00:14:24.900 --> 00:14:28.120
So I'll just throw out also that Python people is going to come back.
00:14:28.280 --> 00:14:32.540
So I am going to do the podcasting thing more again.
00:14:32.840 --> 00:14:34.260
Well, you know, let us know in the episodes.
00:14:34.460 --> 00:14:34.560
Well,
00:14:35.020 --> 00:14:36.660
shout it out in the extras as you know how it goes.
00:14:37.040 --> 00:14:37.860
So thanks a lot.
00:14:38.050 --> 00:14:38.340
See you later.
00:14:39.060 --> 00:14:39.300
Awesome.
00:14:39.530 --> 00:14:40.440
Thank you so much, Brian,
00:14:40.620 --> 00:14:42.860
for being here and being in the show.
00:14:43.380 --> 00:14:45.920
Now let's get back to our group celebration.
00:14:46.960 --> 00:14:48.400
All right, let's jump straight into the items.
00:14:49.360 --> 00:14:50.240
And Nick,
00:14:50.730 --> 00:14:54.320
you have the probably most popular topic
00:14:54.450 --> 00:14:57.240
if you look at the derivative or second derivative
00:14:57.420 --> 00:14:59.740
of how fast it's got attention lately.
00:14:59.860 --> 00:15:00.160
Yeah.
00:15:00.230 --> 00:15:01.320
Tell us about this.
00:15:01.440 --> 00:15:01.800
This is crazy.
00:15:01.940 --> 00:15:04.600
If you have not heard about JEV,
00:15:04.760 --> 00:15:14.760
you have been living under a rock because it's the new kid in the block and it has made quite his presence known.
00:15:15.180 --> 00:15:16.700
It's been raving all over Twitter,
00:15:16.960 --> 00:15:17.640
X, Reddit.
00:15:18.280 --> 00:15:23.200
And what it is, is a new type of AI model that is not like your usual LLM.
00:15:24.280 --> 00:15:27.240
the folks from TypeSafe AI,
00:15:27.490 --> 00:15:31.880
these are the creators of JEV, I'll call it a system one decision model.
00:15:31.970 --> 00:15:35.100
And so system one, if you've read the book, Thinking Fast,
00:15:35.320 --> 00:15:35.840
Thinking Slow,
00:15:36.260 --> 00:15:36.600
they're like two
00:15:36.670 --> 00:15:37.460
different system types,
00:15:37.970 --> 00:15:39.480
the system one and system two.
00:15:39.920 --> 00:15:43.600
So JEV is like very focused on the system one
00:15:43.990 --> 00:15:45.380
type of inference.
00:15:45.870 --> 00:15:47.740
And what this means is that you have,
00:15:48.150 --> 00:15:49.660
instead of generating text,
00:15:50.420 --> 00:15:51.619
like a QN
00:15:51.640 --> 00:16:00.380
model or a ChatGPT model instead it makes decisions on either yes or no offers like gives
00:16:00.380 --> 00:16:06.060
you score probabilities for a rank of choices or it gives you like a score for like how how much
00:16:06.180 --> 00:16:11.260
something is like a range of like a range score about how some how much something is so it's very
00:16:11.620 --> 00:16:17.279
interesting and even though it sounds limited the use cases have been quite insane Vincent from
00:16:17.720 --> 00:16:25.120
Marimo did a video about it and he was benchmarking it against traditional LLMs because for the long,
00:16:25.200 --> 00:16:32.740
I'm a data scientist working and I work with a lot of ML models and classification is one of the
00:16:32.740 --> 00:16:35.160
things that, depending on the situation,
00:16:35.360 --> 00:16:36.800
can be really hard, can be really simple.
00:16:37.280 --> 00:16:38.020
And here comes
00:16:38.220 --> 00:16:42.260
this JEV model that is like a general classifier.
00:16:42.490 --> 00:16:45.679
And so he benchmarked it against a couple of
00:16:45.700 --> 00:16:49.620
real-world data sets and beat all of them.
00:16:49.790 --> 00:16:52.720
In most cases, he beat all of them. He even brought
00:16:53.070 --> 00:16:56.160
like an interesting trick he learned called SetFit.
00:16:56.320 --> 00:16:58.100
You should watch the video. He does a great
00:16:58.540 --> 00:17:05.120
explanation of it that allows you to train like very basic LLM models like BERT or
00:17:06.240 --> 00:17:09.560
QN embedding models and uses it for classification.
00:17:10.420 --> 00:17:12.959
Jev still does it better in terms of accuracy
00:17:12.959 --> 00:17:14.620
and so much cheaper.
00:17:15.199 --> 00:17:16.220
Now, the reason why I brought it up
00:17:16.360 --> 00:17:18.560
was because the use of JEV,
00:17:18.650 --> 00:17:19.880
even though it's really cheap,
00:17:20.130 --> 00:17:21.660
really fast, is really interesting.
00:17:22.020 --> 00:17:23.780
But there is another interesting point
00:17:23.920 --> 00:17:25.380
that Vincent made,
00:17:25.560 --> 00:17:27.699
whereby in most companies,
00:17:28.020 --> 00:17:29.800
there's a lot of data that is unlabeled
00:17:30.140 --> 00:17:32.080
and it is going to be more cost-effective
00:17:32.320 --> 00:17:33.680
to train your own local model
00:17:34.160 --> 00:17:35.860
on your own proprietary data
00:17:36.440 --> 00:17:38.220
than it is to use a general model,
00:17:38.320 --> 00:17:41.040
even if something as cheap and fast as JEV.
00:17:41.260 --> 00:17:51.180
So what you could do is to take the JEV model and help you create more accurate data sets,
00:17:51.620 --> 00:17:53.000
get you more cleaner labels.
00:17:53.600 --> 00:17:55.300
Is that kind of like supervised learning,
00:17:55.520 --> 00:17:56.700
but you use JEV as the supervisor?
00:17:57.580 --> 00:17:57.940
Yeah, exactly.
00:17:58.220 --> 00:18:04.460
So you take some general class and then you create a better data set so you can train supervised models.
00:18:05.100 --> 00:18:15.120
And this is how you like eke out a lot more performance and get better efficiency on very specific tasks to your like business.
00:18:15.440 --> 00:18:17.300
So that's one of the topics I wanted to bring up.
00:18:17.460 --> 00:18:18.740
It's a really interesting video.
00:18:19.320 --> 00:18:20.600
Jev is a really interesting model.
00:18:21.580 --> 00:18:22.580
You guys should go check it out.
00:18:22.920 --> 00:18:24.980
I've seen all this excitement about Jev and I'm like,
00:18:25.400 --> 00:18:27.020
I really want to have a use case for Jev.
00:18:28.520 --> 00:18:30.420
So I haven't had to use it, but I'm glad to hear that you have.
00:18:30.480 --> 00:18:31.160
And that's really cool.
00:18:31.280 --> 00:18:32.060
What do the rest of y'all think?
00:18:32.400 --> 00:18:39.460
Well, it's interesting that the number of classifier models that other labs are coming out with now, a lot of them are taking Quinn and fine tuning it to be a classifier.
00:18:39.470 --> 00:18:42.220
I think Microsoft just announced that's the one they're deploying,
00:18:43.060 --> 00:18:48.840
which I kind of like because I don't know these type secret folks or type secure folks very well.
00:18:49.060 --> 00:18:49.120
But,
00:18:49.390 --> 00:18:52.460
you know, you're sending them all their data because there's no option to use it locally.
00:18:52.840 --> 00:18:53.020
Yeah.
00:18:53.380 --> 00:18:57.120
Yeah, I think it was kind of interesting because when I first heard about Jev, it was like,
00:18:57.280 --> 00:18:57.800
what's the big deal?
00:18:58.020 --> 00:19:01.720
And I understood then I learned that all it did was the very key thing was,
00:19:01.800 --> 00:19:02.600
is does classification,
00:19:02.960 --> 00:19:03.040
right?
00:19:03.180 --> 00:19:06.260
It's not an open-ended write me this code is like answer this.
00:19:06.300 --> 00:19:06.400
Yes,
00:19:06.560 --> 00:19:07.760
no question or put,
00:19:07.980 --> 00:19:08.240
put every,
00:19:08.500 --> 00:19:09.660
put these things in a bucket.
00:19:09.880 --> 00:19:09.980
Right.
00:19:10.200 --> 00:19:15.320
And I think Nick's point about like using that as a quick and dirty way to
00:19:15.980 --> 00:19:19.620
label some data so that you can do your own training model with like scikit
00:19:19.760 --> 00:19:19.920
learn,
00:19:20.360 --> 00:19:23.340
which I will always give a shout out to because it's still my wife's favorite
00:19:23.640 --> 00:19:24.580
Python library in the world.
00:19:25.680 --> 00:19:26.760
It is a great thing, right?
00:19:26.840 --> 00:19:27.960
because I think it's one of these things
00:19:28.040 --> 00:19:29.120
we're also really starting to learn
00:19:29.340 --> 00:19:32.100
is using LLMs to help you
00:19:32.700 --> 00:19:34.200
build the automation for things
00:19:34.800 --> 00:19:36.500
is a better use of your time and money
00:19:36.820 --> 00:19:37.300
slash tokens
00:19:37.940 --> 00:19:39.700
than it is to like ask the models
00:19:39.840 --> 00:19:40.980
to do the same thing over and over
00:19:41.380 --> 00:19:42.220
rather than like, yeah,
00:19:42.400 --> 00:19:43.320
let's use it to help that,
00:19:43.740 --> 00:19:46.080
like use second learn to actually do like full,
00:19:46.200 --> 00:19:47.520
like I'm going to use the long term here.
00:19:47.600 --> 00:19:48.620
So I'm going to try to use the right term,
00:19:48.900 --> 00:19:50.280
but use second learn to build the local model
00:19:50.360 --> 00:19:51.320
that you need to do the classification.
00:19:51.760 --> 00:19:51.880
Yeah.
00:19:52.200 --> 00:19:53.160
That'll be the fastest, cheapest,
00:19:53.540 --> 00:19:54.840
best reproducible way to do it.
00:19:54.980 --> 00:19:56.380
And I think it's great that this is kind of
00:19:56.320 --> 00:19:59.320
helping push that narrative down more and more to more people.
00:19:59.840 --> 00:19:59.960
Yeah,
00:20:00.180 --> 00:20:04.940
it's so much more efficient to have like a model like Jev or a local model than
00:20:04.940 --> 00:20:07.420
to have like Opus running your like home assistant,
00:20:08.140 --> 00:20:08.240
right?
00:20:09.500 --> 00:20:12.340
That's like very cost, like cost not inefficient,
00:20:13.140 --> 00:20:13.640
cost efficient.
00:20:14.080 --> 00:20:14.380
Yeah.
00:20:14.670 --> 00:20:20.040
I mean, I think it seems like it would be something that could be used with like spaCy when you're
00:20:20.280 --> 00:20:23.720
annotating parts of natural language.
00:20:24.460 --> 00:20:27.300
And I think there's some creative ways that,
00:20:27.600 --> 00:20:29.760
you know, you can get decision maybe on a
00:20:29.920 --> 00:20:30.980
first pass or something.
00:20:31.600 --> 00:20:35.660
And I'm looking forward to looking at some of the research because I have heard there's
00:20:35.660 --> 00:20:38.120
a few others at the top of my head.
00:20:38.120 --> 00:20:39.160
I can't name them,
00:20:39.400 --> 00:20:45.080
but some former folks from DeepMind are doing something in the UK,
00:20:45.260 --> 00:20:45.380
I
00:20:45.480 --> 00:20:46.120
believe as well.
00:20:46.400 --> 00:20:46.900
So yeah,
00:20:47.300 --> 00:20:48.620
the real feature here is speed.
00:20:48.920 --> 00:20:53.480
The fact that you can feed it just hundreds of thousands of rows and get answers in microseconds
00:20:53.560 --> 00:20:54.140
and milliseconds.
00:20:54.200 --> 00:20:59.180
yeah yeah that's not a normal ai sort of experience right that's a big deal though
00:20:59.960 --> 00:21:05.840
it's a huge deal all right awesome i definitely think that's a a good pick brett tell us about
00:21:05.890 --> 00:21:11.840
this new council yeah i know uh what the heck am i talking about uh so for those you didn't hear
00:21:12.380 --> 00:21:18.479
um first two weeks of september we had an election i think uh this was covered on python bytes uh for
00:21:18.500 --> 00:21:19.680
Python Packaging Council.
00:21:19.960 --> 00:21:20.500
It is the
00:21:20.620 --> 00:21:21.240
inaugural one.
00:21:22.460 --> 00:21:24.400
And it was all set up via
00:21:24.560 --> 00:21:25.260
PEP772.
00:21:25.780 --> 00:21:26.420
And the
00:21:26.540 --> 00:21:27.000
elections happened.
00:21:27.200 --> 00:21:28.340
It was open to all
00:21:28.540 --> 00:21:30.360
PSF members who
00:21:31.420 --> 00:21:32.380
basically said
00:21:32.380 --> 00:21:33.240
they wanted to vote in it.
00:21:33.600 --> 00:21:34.320
And it
00:21:34.340 --> 00:21:34.460
happened.
00:21:34.700 --> 00:21:36.420
It ended on the
00:21:36.560 --> 00:21:38.300
15th or 16th, probably depending on where you
00:21:38.460 --> 00:21:39.040
were on the planet.
00:21:40.400 --> 00:21:41.340
I ended up on it.
00:21:42.420 --> 00:21:43.340
Ended up on it.
00:21:43.680 --> 00:21:44.460
Dolled stuff as well.
00:21:44.680 --> 00:21:44.920
Henry
00:21:45.620 --> 00:21:47.200
Schreiner and Ralph Gomers.
00:21:47.700 --> 00:21:51.880
So we're all in this inaugural council.
00:21:52.560 --> 00:21:56.700
Perdune and I are on it for two years as the top vote getters.
00:21:57.010 --> 00:22:00.160
And then Donald, Henry, and Ralph are going to be out for a year.
00:22:00.320 --> 00:22:01.360
And then going forward after that,
00:22:01.620 --> 00:22:03.640
all people on it are going to serve for two years.
00:22:04.640 --> 00:22:07.620
So interesting thing with this is it's the first one.
00:22:08.110 --> 00:22:11.340
I will say we've already met four times and actually already had to meet with the steering council.
00:22:11.700 --> 00:22:14.460
And a lot of it's been around logistics and how to organize ourselves.
00:22:15.220 --> 00:22:17.700
As any of you have had to start anything like this from scratch,
00:22:17.960 --> 00:22:19.720
it's about where are we going to keep our notes?
00:22:20.320 --> 00:22:21.900
Where are we going to let people reach us?
00:22:22.080 --> 00:22:22.760
And that kind of stuff.
00:22:22.980 --> 00:22:24.420
So we're still figuring things out.
00:22:25.040 --> 00:22:27.320
The one thing I will say about this council is
00:22:27.760 --> 00:22:32.260
it is explicitly meant to be in charge of the sentence specifications
00:22:32.900 --> 00:22:35.160
and the whole website in general for packaging up python.org
00:22:36.020 --> 00:22:37.780
where you can go and read about all the specs
00:22:38.450 --> 00:22:42.000
relating to the kind of the PyPI slash PyPA side of the world.
00:22:42.920 --> 00:22:43.240
But otherwise,
00:22:43.960 --> 00:22:45.920
PEP772, which established this council,
00:22:46.600 --> 00:22:48.400
did not try to dictate what this council is going to do.
00:22:48.540 --> 00:22:54.280
So we are actually also currently talking about what do we want to see our function be, right?
00:22:54.440 --> 00:22:59.980
Because we're under the auspices of the PSF, hence why they ran the election.
00:23:00.500 --> 00:23:03.820
But we're trying to figure out how do we represent people,
00:23:04.000 --> 00:23:04.140
basically,
00:23:04.480 --> 00:23:04.560
right?
00:23:04.620 --> 00:23:06.100
Like we represent specs,
00:23:06.270 --> 00:23:10.360
but we also want to somehow act as like the public point, I think,
00:23:10.640 --> 00:23:14.280
for and I'm speaking for myself as generalizing for my fellow council members.
00:23:14.880 --> 00:23:15.040
Basically,
00:23:15.200 --> 00:23:17.040
it's kind of the public face of packaging in Python,
00:23:17.260 --> 00:23:17.340
right?
00:23:17.500 --> 00:23:21.280
Who can you go talk to to maybe get funding to make something better?
00:23:21.720 --> 00:23:29.820
Or if we need to go talk to like integrators like the links distros or conda or anyone else who integrates Python and a bunch of other stuff.
00:23:30.160 --> 00:23:32.520
who can you go talk to to get some answers,
00:23:33.070 --> 00:23:36.680
get some questions answered or kind of talk to them to figure out what they need and all that stuff.
00:23:36.860 --> 00:23:39.080
Kind of similar to what the SC does around the language,
00:23:39.880 --> 00:23:41.060
but obviously it's basically about packaging.
00:23:41.760 --> 00:23:42.340
And probably honestly,
00:23:42.760 --> 00:23:44.420
I'm going to guess a little bit around workflow as well,
00:23:44.930 --> 00:23:48.020
because it doesn't fall basically stuff that doesn't fall under the language that way.
00:23:48.980 --> 00:23:49.260
But yeah,
00:23:49.470 --> 00:23:53.020
it was just basically I noticed admin and also I figured I'd bring that up.
00:23:53.960 --> 00:23:54.200
And yeah,
00:23:54.420 --> 00:23:56.040
it's as I said, we've just been going.
00:23:56.960 --> 00:23:59.560
We have a issue tracker on GitHub.
00:23:59.740 --> 00:24:02.480
We haven't made public yet because we're getting our initial notes and stuff set up,
00:24:02.640 --> 00:24:02.840
but we're
00:24:02.840 --> 00:24:04.340
going to try to be as transparent as possible.
00:24:05.020 --> 00:24:09.060
So like we're planning to keep our media notes up there and keep track of what we're going
00:24:09.060 --> 00:24:12.520
to talk about, what's on deck and all that and be accessible.
00:24:13.480 --> 00:24:16.240
Discuss the Python.org is where a lot of the packaging discussions happen.
00:24:16.660 --> 00:24:17.620
So you can find us there.
00:24:18.220 --> 00:24:18.680
And yeah,
00:24:19.160 --> 00:24:22.119
we're getting going, but we have high hopes that we can hopefully up the throughput
00:24:22.140 --> 00:24:29.960
a bit on stuff because poor Paul Moore used to be the vanilla dictator for packaging.
00:24:30.630 --> 00:24:36.200
Now it gets a bit of a break and at least spreading across the five of us will start
00:24:36.200 --> 00:24:36.800
some things a bit.
00:24:37.120 --> 00:24:41.280
And we can keep doing stuff such as talking about wheel variants.
00:24:41.510 --> 00:24:45.900
And I know there's wheel next being proposed and a whole bunch of kind of big projects that
00:24:46.080 --> 00:24:49.160
hopefully we can help go forward and make packaging for Python just better for everybody.
00:24:49.320 --> 00:24:52.880
Well, because packaging has always been such a simple and easy story in the Python world.
00:24:53.220 --> 00:24:54.640
So simple and so easy.
00:24:54.900 --> 00:24:55.300
I know.
00:24:55.920 --> 00:25:00.700
C and Fortran and all these other languages made it so easy for us to integrate that I
00:25:00.800 --> 00:25:01.940
don't know why anyone's ever complained.
00:25:02.160 --> 00:25:03.220
I'm glad you all are here.
00:25:03.560 --> 00:25:12.680
Yeah, but I will say like the journey of Python packaging from like cheese to eggs to wheels,
00:25:13.280 --> 00:25:18.300
it's actually been pretty amazing to see the evolution of Python packaging.
00:25:18.400 --> 00:25:18.980
So thanks,
00:25:19.300 --> 00:25:21.100
Brett, for championing that.
00:25:21.190 --> 00:25:22.800
I feel like you care so much about that.
00:25:23.220 --> 00:25:28.040
And that's why it's still you and others are making it such a pleasant,
00:25:28.260 --> 00:25:29.180
at least more pleasant
00:25:29.740 --> 00:25:30.100
experience.
00:25:30.680 --> 00:25:31.120
Well, thank you.
00:25:31.120 --> 00:25:32.040
I appreciate the kind words.
00:25:32.240 --> 00:25:32.400
Yeah,
00:25:32.580 --> 00:25:34.980
it has been a bit of a journey for packaging and Python in general,
00:25:35.160 --> 00:25:35.280
right?
00:25:35.360 --> 00:25:40.000
Like the creation of the Cheeshop slash Python Packaging Index,
00:25:40.260 --> 00:25:40.960
because people were too worried
00:25:41.080 --> 00:25:42.980
we'd upset managers if we called it the Cheeshop.
00:25:43.320 --> 00:25:44.500
FYI, if you go to a 404,
00:25:44.840 --> 00:25:47.660
it still links to the Cheeshop sketch on YouTube from Monty Python.
00:25:48.000 --> 00:25:48.320
for a reason.
00:25:48.720 --> 00:25:49.880
I'm glad that's still there
00:25:49.940 --> 00:25:52.060
because I will, being of an age,
00:25:52.140 --> 00:25:53.680
I will still call it the cheese shop.
00:25:55.160 --> 00:25:56.100
Yeah, you've got to do it
00:25:56.320 --> 00:25:56.960
on PyPI, though.
00:25:57.240 --> 00:25:58.160
Oh, PyPI, okay.
00:25:58.360 --> 00:25:59.240
Sorry if I said Python.
00:25:59.480 --> 00:26:00.000
That was my
00:26:00.240 --> 00:26:00.300
mistake.
00:26:00.460 --> 00:26:00.720
No, no.
00:26:01.900 --> 00:26:02.760
Yes, there it is.
00:26:03.220 --> 00:26:03.500
There you go.
00:26:05.840 --> 00:26:06.740
But yeah, it's been a journey,
00:26:06.980 --> 00:26:07.840
right? And it's been very driven
00:26:07.900 --> 00:26:08.880
by the community and,
00:26:09.240 --> 00:26:09.800
to be frank,
00:26:10.100 --> 00:26:11.280
very much driven by volunteers.
00:26:12.380 --> 00:26:13.900
So it's moved at the space,
00:26:14.160 --> 00:26:15.879
the speed of people having time
00:26:15.900 --> 00:26:16.200
to help,
00:26:16.550 --> 00:26:17.840
but it's been progressing
00:26:18.130 --> 00:26:19.660
forward and it's something I think everyone cares about.
00:26:20.040 --> 00:26:21.820
And as I kind of joked, doing the best
00:26:21.830 --> 00:26:23.840
we can in the face of Python being the glue
00:26:23.980 --> 00:26:25.760
language of the internet means we have to
00:26:25.860 --> 00:26:27.700
integrate with some languages who do not really
00:26:28.000 --> 00:26:29.800
have their up together in terms of
00:26:30.040 --> 00:26:30.780
packaging themselves.
00:26:31.170 --> 00:26:31.780
And so how do we
00:26:31.900 --> 00:26:32.540
work around that,
00:26:32.720 --> 00:26:33.020
right? Like
00:26:33.780 --> 00:26:35.700
we can go to the C community or
00:26:35.800 --> 00:26:37.840
C++ or any of these other compiled languages
00:26:37.870 --> 00:26:38.140
and go like,
00:26:38.360 --> 00:26:38.420
well,
00:26:38.580 --> 00:26:39.320
hey, how do you package?
00:26:39.520 --> 00:26:39.580
Like,
00:26:39.920 --> 00:26:40.080
oh,
00:26:40.400 --> 00:26:40.740
shell scripts.
00:26:41.540 --> 00:26:41.660
Oh,
00:26:41.910 --> 00:26:42.320
okay, great.
00:26:42.610 --> 00:26:43.640
So how do we integrate with that?
00:26:43.800 --> 00:26:43.920
Right?
00:26:44.140 --> 00:26:45.340
So it's been quite the journey.
00:26:45.740 --> 00:26:52.900
And I would like to think we've gotten to a point where the ergonomics are good and it's not painful anymore.
00:26:54.020 --> 00:26:58.780
But I think there's some opportunities for it to be better and definitely faster.
00:26:59.480 --> 00:27:01.140
And obviously the work's not done.
00:27:01.440 --> 00:27:01.660
Yeah,
00:27:01.900 --> 00:27:02.180
I mean,
00:27:02.440 --> 00:27:03.620
it's been, I mean,
00:27:03.840 --> 00:27:05.880
just the council itself,
00:27:06.740 --> 00:27:11.880
it's been a multi-year journey just to get the PEP approved and written.
00:27:12.780 --> 00:27:12.980
And,
00:27:14.100 --> 00:27:25.220
you know, it was great to see the number of folks that ran for the Packaging Council and really pleased by the people that were elected or chosen.
00:27:26.530 --> 00:27:30.200
I think it's a really great cross section of historical knowledge,
00:27:31.020 --> 00:27:32.020
scientific knowledge,
00:27:33.360 --> 00:27:33.580
you know,
00:27:33.940 --> 00:27:36.000
across a number of different tools.
00:27:37.040 --> 00:27:38.500
And, you know,
00:27:38.840 --> 00:27:44.180
having Brett having been part of the steering council when we did the inaugural steering council,
00:27:44.660 --> 00:27:46.100
bootstrapping something like this,
00:27:46.260 --> 00:27:47.420
there's some knowledge in there.
00:27:47.440 --> 00:27:48.420
So that's awesome.
00:27:48.860 --> 00:27:52.240
But one of the things I'm super happy about is,
00:27:52.620 --> 00:27:52.840
you know,
00:27:53.000 --> 00:27:56.940
having more emphasis on the standards and,
00:27:58.320 --> 00:28:00.580
you know, there's going to be different tool implementations.
00:28:00.740 --> 00:28:01.300
and that's great.
00:28:01.630 --> 00:28:04.680
I would love to see us get more of a focus
00:28:05.060 --> 00:28:06.940
on the consumers of packages
00:28:07.580 --> 00:28:10.740
and people who are using our packages on a day-to-day
00:28:11.120 --> 00:28:12.720
and making that more pleasant
00:28:13.090 --> 00:28:15.560
like when you're using a GPU and other things
00:28:15.820 --> 00:28:17.260
because the landscape has changed.
00:28:17.760 --> 00:28:20.800
So thank you, Brett, for continuing to serve us.
00:28:21.300 --> 00:28:21.480
Yeah,
00:28:21.700 --> 00:28:21.960
thanks, Brett.
00:28:22.560 --> 00:28:25.220
You have this legacy of launching councils.
00:28:25.760 --> 00:28:26.620
So that's very cool.
00:28:27.780 --> 00:28:31.200
I feel like it seemed like packaging was kind of solved.
00:28:31.310 --> 00:28:33.680
And then uv came along and we're like, well, now it's really solved.
00:28:34.020 --> 00:28:35.100
But then we also have AI,
00:28:35.700 --> 00:28:39.620
which means CUDA and all the crazy stuff that Wheel Next is trying to solve.
00:28:39.790 --> 00:28:44.680
And we've got the brand new PEP that got accepted for Emscripten and WebAssembly,
00:28:45.060 --> 00:28:46.180
which is a whole nother angle.
00:28:46.540 --> 00:28:48.400
And so I don't feel like it's solved for sure.
00:28:48.720 --> 00:28:48.960
Well,
00:28:49.140 --> 00:28:51.120
and Pixie has done a great job,
00:28:51.380 --> 00:28:51.460
too,
00:28:51.620 --> 00:28:52.880
in the scientific community.
00:28:53.140 --> 00:28:53.420
So,
00:28:53.780 --> 00:28:57.400
I mean, I think tools are kind of reflecting their users,
00:28:57.940 --> 00:29:00.420
and I think the standards are what makes that possible.
00:29:00.900 --> 00:29:06.140
So it's great to see more domains being represented within packaging.
00:29:06.400 --> 00:29:06.880
A question,
00:29:07.620 --> 00:29:14.820
Brett, is the council going to be consulting or working with our security developer in residence?
00:29:15.210 --> 00:29:15.680
Because of like,
00:29:16.100 --> 00:29:17.340
as you know, like we have all these,
00:29:17.530 --> 00:29:19.200
we have more CVEs being,
00:29:19.880 --> 00:29:20.520
you know, issued,
00:29:20.920 --> 00:29:22.420
especially attacking packaging.
00:29:23.080 --> 00:29:23.320
Yeah.
00:29:23.510 --> 00:29:23.660
So,
00:29:25.590 --> 00:29:25.780
yeah,
00:29:26.020 --> 00:29:26.920
there's Seth Michael Larson,
00:29:27.400 --> 00:29:30.460
who's the security developer in residence for Python itself.
00:29:30.940 --> 00:29:32.440
There's Michael Fiedler,
00:29:32.590 --> 00:29:34.640
who works on PyPI directly.
00:29:35.640 --> 00:29:36.040
And yeah,
00:29:37.130 --> 00:29:38.040
pretty much everyone on the council
00:29:38.150 --> 00:29:41.000
either knows either of them directly personally
00:29:41.930 --> 00:29:45.740
or because we're working under the PSF in a way,
00:29:46.860 --> 00:29:48.640
we know we can always just ask like,
00:29:48.750 --> 00:29:50.660
hey, can we talk to Mike about something or whatever?
00:29:51.250 --> 00:29:54.120
But I message Mike and Seth directly about stuff.
00:29:55.200 --> 00:29:56.560
So it's definitely there.
00:29:57.120 --> 00:30:00.060
And for instance, I will say part of my platform for running
00:30:00.400 --> 00:30:01.860
was on secure supply chain,
00:30:02.110 --> 00:30:02.240
right?
00:30:02.480 --> 00:30:08.020
So I will say I personally am interested slash invested in trying to see that improve.
00:30:08.200 --> 00:30:12.000
So security and how packaging plays into that is definitely going to be a thing.
00:30:12.280 --> 00:30:13.520
Now, I will say we,
00:30:14.100 --> 00:30:16.660
PyPI does not refer to us or vice versa.
00:30:17.080 --> 00:30:18.940
So it's very much going to be a collaboration.
00:30:20.060 --> 00:30:23.700
But we are definitely aware that it is something that we want to work with PyPI to make sure
00:30:23.700 --> 00:30:26.560
that anything we do will work well for them and everyone else in the ecosystem,
00:30:26.760 --> 00:30:26.820
right?
00:30:27.120 --> 00:30:29.800
Because as Carol pointed out, we have a pretty good, I think,
00:30:30.180 --> 00:30:31.200
breadth of coverage for the
00:30:31.200 --> 00:30:35.860
very broad community that we have in Python on this council to make sure that all corners,
00:30:36.200 --> 00:30:37.320
whether it's scripting,
00:30:37.780 --> 00:30:38.000
web,
00:30:38.360 --> 00:30:38.820
data science,
00:30:39.540 --> 00:30:40.780
or an LLM,
00:30:41.120 --> 00:30:43.260
you name it, I think someone on this
00:30:43.400 --> 00:30:46.000
council has a connection to somebody to make sure that we cover all the bases.
00:30:46.260 --> 00:30:46.820
And that includes
00:30:47.040 --> 00:30:47.200
security.
00:30:47.620 --> 00:30:50.920
And it's definitely something we have top of mind to make sure that we address.
00:30:51.280 --> 00:30:51.380
So.
00:30:51.740 --> 00:30:51.840
Yeah.
00:30:52.220 --> 00:30:53.020
That's a good question.
00:30:53.620 --> 00:30:57.519
The security side of any sort of packaging is definitely so front
00:30:57.540 --> 00:31:04.380
center these days you know but you know else is many many parsing many things speed michael speed
00:31:04.540 --> 00:31:10.560
is the feature we've talked about this before and it's interesting nick brought up jev we brought up
00:31:10.560 --> 00:31:15.180
the fact like this speed is a feature for like the a lot of the astral tools like rough and uv
00:31:15.780 --> 00:31:21.860
but most folks don't think of python as being fast at parsing json the this article here is a blog
00:31:21.840 --> 00:31:27.500
post from Daniel Lemire. He benchmarks a new wrapper around SIMD JSON,
00:31:27.720 --> 00:31:29.260
which is a C++ library
00:31:29.280 --> 00:31:29.980
I've never used,
00:31:30.140 --> 00:31:35.780
but he wrote a fast SIMD JSON wrapper around it and actually demonstrates parsing
00:31:36.100 --> 00:31:39.640
tens of gigabytes of JSON per second in Python.
00:31:40.160 --> 00:31:40.260
Now,
00:31:40.560 --> 00:31:40.900
there's a trick,
00:31:41.400 --> 00:31:41.560
obviously.
00:31:42.200 --> 00:31:43.080
Doing things in
00:31:43.280 --> 00:31:44.980
async, you know, is always not necessarily straightforward.
00:31:45.140 --> 00:31:46.280
Doing things threading is
00:31:46.420 --> 00:31:47.080
obviously never straightforward.
00:31:47.840 --> 00:31:50.220
Free threading brings a new wrinkle to all this, and a lot of
00:31:50.120 --> 00:31:55.840
folks have probably not tried out the free threading capabilities of Python 3.14 and now 3.15.
00:31:56.200 --> 00:32:00.360
This is actually a really good example, or at least a toy use case where boy, does it make a
00:32:00.660 --> 00:32:00.980
big difference.
00:32:01.280 --> 00:32:02.520
So he goes through,
00:32:03.740 --> 00:32:06.020
he's got a dual Xeon 64 core machine.
00:32:06.630 --> 00:32:07.440
So he's actually able
00:32:07.440 --> 00:32:14.520
to take that free threading and spread this workload across 64 different cores simultaneously.
00:32:15.160 --> 00:32:20.520
This is a GitHub archive snapshot of, I think, what, eight hours of GitHub data,
00:32:21.090 --> 00:32:21.440
which turns out
00:32:21.440 --> 00:32:25.040
to be about 7.6 gigabytes of JSON decompressed,
00:32:25.410 --> 00:32:26.820
2.2 million events,
00:32:27.440 --> 00:32:27.940
runs it through.
00:32:28.300 --> 00:32:28.860
The very
00:32:29.060 --> 00:32:31.560
first one he did was basically a non-threaded,
00:32:31.990 --> 00:32:32.120
non,
00:32:32.580 --> 00:32:34.440
it's like single-threaded version of this.
00:32:35.050 --> 00:32:37.060
So if you are looking at the standard JSON library,
00:32:37.630 --> 00:32:41.419
it only basically takes about 42 seconds to
00:32:41.440 --> 00:32:47.160
parsed the whole set, which are basically new line return JSON messages for every pull request that
00:32:47.160 --> 00:32:47.920
has happened in GitHub.
00:32:48.420 --> 00:32:51.940
So you can see here 0.18 gigabytes per second of throughput.
00:32:52.460 --> 00:32:52.580
The
00:32:53.200 --> 00:32:56.120
wrapper, he does the same thing for ORJSON,
00:32:57.160 --> 00:32:58.140
fast SIMD,
00:32:58.400 --> 00:33:00.280
JSON map mini, which is another approach he
00:33:00.400 --> 00:33:00.500
took.
00:33:00.780 --> 00:33:01.740
And then the lazy views,
00:33:01.920 --> 00:33:04.740
which is basically don't actually construct the dictionaries until I
00:33:04.940 --> 00:33:06.200
ask for them version of this.
00:33:06.640 --> 00:33:10.380
That got the 2.13 gigabytes per second. So that's obviously not as
00:33:10.320 --> 00:33:12.000
as fast as tens of gigabytes per second,
00:33:12.430 --> 00:33:13.880
then moving into free threading.
00:33:13.890 --> 00:33:16.720
So if you open up and start using all 64 cores,
00:33:17.280 --> 00:33:18.380
and still in one process,
00:33:18.940 --> 00:33:19.680
one Python process,
00:33:19.960 --> 00:33:21.800
64 cores on free threading,
00:33:23.120 --> 00:33:28.140
65.7 gigabytes per second of reading in that JSON file.
00:33:28.520 --> 00:33:30.240
So I think you could see some magic here
00:33:30.240 --> 00:33:33.660
if you combined a large JSON workload with tools like JEV,
00:33:34.020 --> 00:33:35.700
where you wanted to do some real-time processing
00:33:35.890 --> 00:33:38.240
and pull back the results as fast as possible.
00:33:38.800 --> 00:33:40.880
This is a very valid use case for this,
00:33:41.460 --> 00:33:42.220
but it's only one of many.
00:33:42.740 --> 00:33:45.420
The other bit here, he uses that there's a lazy trick
00:33:45.440 --> 00:33:46.140
in here, which I mentioned,
00:33:46.320 --> 00:33:48.500
which he doesn't instantiate the dictionaries
00:33:48.620 --> 00:33:49.500
until they're asked for.
00:33:49.860 --> 00:33:51.260
But in many cases that may be useful.
00:33:51.660 --> 00:33:54.320
You may only want to filter or pull back portions
00:33:54.440 --> 00:33:55.840
of the data and not the whole dataset.
00:33:56.040 --> 00:33:57.480
'Cause like for example, in this use case,
00:33:57.820 --> 00:34:01.380
I think each message is about 3K inside that dataset.
00:34:01.740 --> 00:34:04.580
So fairly large object each time.
00:34:05.180 --> 00:34:05.700
Let's see here.
00:34:06.320 --> 00:34:11.879
basically a 31 times speed up over single chord regular speed,
00:34:12.220 --> 00:34:12.840
which is pretty incredible.
00:34:14.060 --> 00:34:17.840
It's also a simple, you kind of got to take this a little bit of grain of salt.
00:34:18.080 --> 00:34:18.580
It's a simple use
00:34:18.780 --> 00:34:18.940
case,
00:34:19.679 --> 00:34:22.520
but if you've got the work that looks kind of like this, you may want to check out,
00:34:22.720 --> 00:34:22.960
he's what
00:34:22.990 --> 00:34:28.060
the maintainer of this wrapper around the simdjson library itself.
00:34:28.590 --> 00:34:29.260
The benchmarks,
00:34:29.800 --> 00:34:30.620
he links to them
00:34:30.790 --> 00:34:34.040
in the code. So in that blog post, you'll see the code used in the blog post.
00:34:34.500 --> 00:34:35.260
Here's all the,
00:34:35.379 --> 00:34:39.340
if you wanted to reproduce this yourself on your own hardware and see how that goes.
00:34:40.100 --> 00:34:40.980
And it's
00:34:41.120 --> 00:34:45.020
available on PyPI as fast as MDJSON.
00:34:45.179 --> 00:34:45.460
Actually,
00:34:45.679 --> 00:34:47.700
there's a new release since I looked at this
00:34:48.110 --> 00:34:48.679
an hour ago.
00:34:48.929 --> 00:34:52.540
So very active work going into this. I think it's getting a little bit of attention
00:34:52.850 --> 00:34:54.840
out there in the internets.
00:34:55.480 --> 00:34:56.240
I'm impressed.
00:34:56.780 --> 00:34:57.240
That's pretty awesome.
00:34:57.480 --> 00:34:59.640
And kind of a not explored free
00:34:59.760 --> 00:35:03.299
threading much because I don't have this kind of a workload. But boy, does that make a great
00:35:03.320 --> 00:35:09.080
argument for python is not slow once we got unleashed upon all the cores yeah i mean there's
00:35:09.080 --> 00:35:15.300
an old saying in the community right python's fast enough and yeah he really is and prototype it and
00:35:15.300 --> 00:35:19.620
if it's not fast enough then you start to look at what you have to do speed up and i think free
00:35:19.780 --> 00:35:23.000
threading adds a new wrinkle to it because originally it was always the answer yeah make
00:35:23.000 --> 00:35:26.840
sure you're using the proper data structure and algorithms right that usually got people most of
00:35:26.840 --> 00:35:30.820
the way and then at the end you'd throw in that extra wrapper traditionally would have been in
00:35:30.840 --> 00:35:32.460
like C or C++ nowadays,
00:35:32.900 --> 00:35:33.300
probably Rust.
00:35:33.640 --> 00:35:33.880
Probably Rust,
00:35:34.050 --> 00:35:34.140
yeah.
00:35:34.190 --> 00:35:35.800
But I think free threading throws in a new,
00:35:36.300 --> 00:35:36.620
well,
00:35:36.840 --> 00:35:38.020
can you go multi-threaded
00:35:38.140 --> 00:35:39.000
and get a win that way,
00:35:39.270 --> 00:35:39.380
right?
00:35:39.700 --> 00:35:40.740
And because, I mean,
00:35:41.040 --> 00:35:42.900
you want to make sure you go down
00:35:43.100 --> 00:35:45.080
the ladder of complexity,
00:35:45.400 --> 00:35:45.540
right?
00:35:45.590 --> 00:35:47.760
And the shortest one is write data structures,
00:35:48.100 --> 00:35:48.500
write algorithm,
00:35:48.880 --> 00:35:50.100
then it's throw in free threading,
00:35:50.500 --> 00:35:51.720
then you start talking about
00:35:51.750 --> 00:35:52.900
whether or not you want to go all the way out
00:35:53.060 --> 00:35:53.760
to a whole other language.
00:35:54.260 --> 00:35:54.340
Yeah,
00:35:54.530 --> 00:35:56.740
because each step gets progressively
00:35:57.030 --> 00:35:58.980
more difficult to triage and debug.
00:35:59.500 --> 00:35:59.860
Exactly.
00:36:00.340 --> 00:36:02.380
But I think that's a good point to me, Calvin.
00:36:02.500 --> 00:36:02.740
It's like,
00:36:02.970 --> 00:36:04.240
I think this is what's going to start happening
00:36:04.270 --> 00:36:06.500
is people are going to start using free threading,
00:36:06.660 --> 00:36:07.340
especially in the libraries
00:36:07.490 --> 00:36:08.960
where you directly don't have to maintain
00:36:09.370 --> 00:36:10.340
or manage the complexity
00:36:10.700 --> 00:36:11.960
and it will take care of it for you.
00:36:12.360 --> 00:36:12.940
In which case,
00:36:13.310 --> 00:36:14.740
I think things start to open up a bit
00:36:14.830 --> 00:36:16.620
under these new free threading builds.
00:36:17.080 --> 00:36:18.200
And IO is always a big one,
00:36:18.380 --> 00:36:18.440
right?
00:36:18.740 --> 00:36:21.640
How could we massively split apart a file,
00:36:21.980 --> 00:36:24.500
the giant file and do something fast with it with Python?
00:36:24.880 --> 00:36:25.480
So these benchmarks,
00:36:25.720 --> 00:36:26.420
I'll also note,
00:36:26.780 --> 00:36:28.460
this was post reading it into memory
00:36:28.680 --> 00:36:30.300
and then doing the processing
00:36:30.320 --> 00:36:32.920
timing started. So it was all in memory and then processed.
00:36:33.160 --> 00:36:36.080
So there was no IO from disk involved
00:36:36.100 --> 00:36:36.600
in those benchmarks.
00:36:37.040 --> 00:36:42.380
Is there a similar library in Rust that maybe got compared to this?
00:36:42.680 --> 00:36:42.780
Because
00:36:43.140 --> 00:36:43.980
it seems pretty cool,
00:36:44.140 --> 00:36:48.860
but it seems like a natural intention would be to do something similar in Rust.
00:36:49.280 --> 00:36:49.400
Oh,
00:36:49.580 --> 00:36:50.780
our JSON might be Rust.
00:36:51.300 --> 00:36:52.800
That was in part of it.
00:36:53.600 --> 00:36:55.000
It was in the second part.
00:36:55.160 --> 00:36:56.660
It was in the second part. They'd benchmarked it.
00:36:56.820 --> 00:36:58.180
This one is C++.
00:36:59.100 --> 00:36:59.400
Right.
00:36:59.820 --> 00:36:59.960
Yeah.
00:37:00.220 --> 00:37:01.120
It's only a matter of days,
00:37:01.360 --> 00:37:01.420
right?
00:37:01.560 --> 00:37:02.360
Then this will be rust.
00:37:04.960 --> 00:37:05.080
Yeah.
00:37:05.080 --> 00:37:07.340
I'll just tell my agent to go port it right now.
00:37:07.640 --> 00:37:07.760
Yeah.
00:37:07.870 --> 00:37:12.080
Like I'm sure someone's wrapped, maybe, or Jason's wrapped around Surday or something,
00:37:12.300 --> 00:37:13.320
because I know today's a big one.
00:37:13.420 --> 00:37:14.700
Or Armin just wrote,
00:37:14.860 --> 00:37:17.000
Armin Roenacker just released a new,
00:37:17.240 --> 00:37:18.260
Jason,
00:37:18.440 --> 00:37:22.540
a new alternative to Surday for very specific reasons.
00:37:22.900 --> 00:37:23.040
Yeah.
00:37:23.420 --> 00:37:24.900
It'd be interesting to know what that would be.
00:37:24.900 --> 00:37:27.520
We're talking tens of gigabytes per second.
00:37:28.040 --> 00:37:28.120
Yeah.
00:37:28.200 --> 00:37:29.460
If you have those kinds of problems,
00:37:29.760 --> 00:37:31.100
I'd love to talk to you actually,
00:37:31.760 --> 00:37:32.060
because that sounds
00:37:32.220 --> 00:37:32.520
pretty cool.
00:37:32.960 --> 00:37:33.380
Very cool.
00:37:33.740 --> 00:37:37.020
I am pretty sure that ORJSON is Rust.
00:37:37.280 --> 00:37:38.020
I think it is.
00:37:38.040 --> 00:37:39.120
It's 55% Python,
00:37:39.280 --> 00:37:40.140
44% Rust.
00:37:40.300 --> 00:37:41.120
It could be written in shell.
00:37:41.320 --> 00:37:41.680
I don't know.
00:37:41.960 --> 00:37:43.780
The core, it could be like the tight loop could be in shell.
00:37:43.860 --> 00:37:44.420
It's 1% shell,
00:37:44.760 --> 00:37:45.380
but unlikely.
00:37:46.320 --> 00:37:51.140
I mean, that's how we used to distribute installers was the executable compressed archives that
00:37:51.220 --> 00:37:52.120
would look like a shell script.
00:37:52.160 --> 00:37:52.400
You just,
00:37:52.700 --> 00:37:52.840
you know,
00:37:53.220 --> 00:37:54.620
sh passed the script.
00:37:55.020 --> 00:37:55.500
That's funny.
00:37:55.660 --> 00:37:56.080
All right, well,
00:37:56.560 --> 00:37:59.620
let's get on to something totally different and talk about speed.
00:38:00.020 --> 00:38:01.000
Okay, speed sounds great.
00:38:01.420 --> 00:38:01.800
Let's do it, Michael.
00:38:02.020 --> 00:38:02.940
Let's do it, speed.
00:38:03.540 --> 00:38:07.620
So I want to come back to a former fellow Portlander,
00:38:07.830 --> 00:38:08.440
Miguel Grinberg,
00:38:08.660 --> 00:38:10.120
who's now, I believe, in Ireland,
00:38:10.340 --> 00:38:10.620
Scotland,
00:38:10.780 --> 00:38:11.420
one of those two places,
00:38:11.910 --> 00:38:12.780
unless he's moved again.
00:38:13.200 --> 00:38:18.580
But he has a yearly Python performance benchmark that he puts out.
00:38:18.770 --> 00:38:24.720
So I thought, hey, it's kind of 315 week if you count seven-day rolling window instead of a calendar week.
00:38:25.000 --> 00:38:28.760
So we just had Python 3.15 come out and he said it's time again for this.
00:38:28.790 --> 00:38:29.580
So I thought, you know what?
00:38:29.800 --> 00:38:31.560
Let's have a look and just talk real quick about it.
00:38:31.640 --> 00:38:32.340
This one will be pretty short.
00:38:32.740 --> 00:38:34.600
It's got some interesting things.
00:38:34.780 --> 00:38:37.080
It's not a super complex benchmark,
00:38:37.480 --> 00:38:38.520
so keep that in mind.
00:38:38.980 --> 00:38:41.420
But it does involve a whole bunch of versions,
00:38:41.620 --> 00:38:42.080
all the,
00:38:42.280 --> 00:38:44.780
hold on, even one of the unsupported
00:38:44.930 --> 00:38:45.800
older 3.10s.
00:38:45.800 --> 00:38:48.380
I don't know, 3.10 sounds still pretty new to me, but it's not.
00:38:48.580 --> 00:38:53.220
And PyPy, the JIT compiled version or JIT running version for JIT.
00:38:53.460 --> 00:38:54.740
and node and rust.
00:38:54.980 --> 00:38:55.640
It also says,
00:38:55.860 --> 00:38:57.380
well, let's take the regular CPython,
00:38:57.900 --> 00:38:59.060
the one with the experimental
00:38:59.300 --> 00:39:00.880
JIT and the one with free threading,
00:39:01.260 --> 00:39:02.400
and then do all those comparisons.
00:39:02.920 --> 00:39:04.160
So let's look through.
00:39:04.380 --> 00:39:04.480
It
00:39:04.580 --> 00:39:08.420
says, hey, we're just going to do a single threaded Fibonacci type of pretty big Fibonacci,
00:39:08.760 --> 00:39:08.940
depending
00:39:09.160 --> 00:39:10.260
on how you write it, I suppose,
00:39:10.600 --> 00:39:11.280
40 numbers.
00:39:11.760 --> 00:39:15.160
Fibonacci gets big fast, but you can memoize it and stuff
00:39:15.180 --> 00:39:16.220
and it's a lot quicker.
00:39:16.440 --> 00:39:18.460
But I imagine this is trying to make it hard, right?
00:39:18.760 --> 00:39:19.300
Well, yeah, because
00:39:19.220 --> 00:39:22.500
it takes 15 seconds to answer the question on Python 3.10.
00:39:22.730 --> 00:39:23.580
So there's a bunch of charts,
00:39:23.610 --> 00:39:24.560
you can go look at the article.
00:39:25.070 --> 00:39:28.920
But if you think about performance of even 3.10, which had some of
00:39:29.000 --> 00:39:31.000
that faster CPython work done to it,
00:39:31.220 --> 00:39:34.480
it's 44% as fast as today's Python.
00:39:34.860 --> 00:39:37.440
So we've gotten 56% faster.
00:39:37.740 --> 00:39:39.040
That's a significant improvement,
00:39:39.390 --> 00:39:41.240
even just for this sort of straightforward stuff. And there's a
00:39:41.340 --> 00:39:42.720
lot of things that are not factored in here.
00:39:42.940 --> 00:39:46.060
But then 3.11 was 1.7 times faster.
00:39:46.520 --> 00:39:47.040
You'll see that
00:39:47.180 --> 00:39:52.120
3.11 and I think 3.14 are the two that make really big jumps a lot of the times here.
00:39:52.500 --> 00:39:53.840
So we've got 3.11,
00:39:54.140 --> 00:39:55.920
which is 1.7 times faster.
00:39:56.280 --> 00:40:01.600
And then the jump from 14 to 15 is only 3% faster.
00:40:01.760 --> 00:40:03.420
So not dramatically faster,
00:40:03.800 --> 00:40:05.160
but that's for this particular benchmark.
00:40:05.360 --> 00:40:07.480
There's other areas where it would be dramatically faster.
00:40:07.900 --> 00:40:09.240
And PyPy312,
00:40:09.780 --> 00:40:11.220
5.5 times as fast.
00:40:11.620 --> 00:40:13.020
Node, not as fast,
00:40:13.400 --> 00:40:14.680
but almost five times faster.
00:40:14.900 --> 00:40:15.060
Rust,
00:40:15.320 --> 00:40:17.020
you know, just a little 77 times faster.
00:40:17.920 --> 00:40:18.200
I don't know.
00:40:19.020 --> 00:40:21.380
I'll pull up the graph for you all.
00:40:21.580 --> 00:40:23.160
Quick thoughts before I go on to the next one.
00:40:23.380 --> 00:40:23.800
Anyone have thoughts?
00:40:24.180 --> 00:40:28.420
It still amazes me how PyPy consistently is,
00:40:29.100 --> 00:40:30.240
at least with these kinds of workloads,
00:40:31.079 --> 00:40:32.720
showcases how performant it is.
00:40:33.340 --> 00:40:33.760
I know.
00:40:33.760 --> 00:40:35.740
I always think I should really check this out.
00:40:35.910 --> 00:40:37.600
But I think the challenge is
00:40:38.060 --> 00:40:40.000
then you want to go and import some library
00:40:40.200 --> 00:40:41.540
and it's incompatible with PyPy.
00:40:41.630 --> 00:40:43.880
And you're like, well, it goes from pretty,
00:40:44.080 --> 00:40:46.580
you know, five times faster to impossible and doesn't run.
00:40:46.650 --> 00:40:46.960
Like, oh,
00:40:47.320 --> 00:40:48.340
I'm not doing that, you know?
00:40:48.560 --> 00:40:52.780
I do remember announcements with the latest release of PyPy
00:40:53.100 --> 00:40:58.020
that they're trying to interface better with the CPython EBI
00:40:58.420 --> 00:41:02.020
so that external libraries can just like work in PyPy.
00:41:02.320 --> 00:41:04.660
So that's an exciting news, but still, it's so amazing.
00:41:04.960 --> 00:41:08.860
What surprises me is Node still being faster than Python.
00:41:09.330 --> 00:41:10.460
And I really,
00:41:10.700 --> 00:41:12.880
I have respect for TypeScript and JavaScript,
00:41:13.280 --> 00:41:14.780
But still, it still amazes me.
00:41:14.860 --> 00:41:16.980
It just makes me realize how much engineering
00:41:17.200 --> 00:41:19.900
went to the V8 engine.
00:41:20.100 --> 00:41:20.180
Yeah.
00:41:20.200 --> 00:41:21.140
It's amazing.
00:41:22.040 --> 00:41:24.560
It's decades of fully funded,
00:41:24.900 --> 00:41:25.920
full team support
00:41:26.550 --> 00:41:27.320
versus Python,
00:41:27.700 --> 00:41:30.200
which as Michael alluded to, right?
00:41:30.800 --> 00:41:33.000
Just started maybe five,
00:41:33.160 --> 00:41:33.780
six years ago,
00:41:34.080 --> 00:41:35.300
getting external funded,
00:41:35.700 --> 00:41:37.740
let's make it faster kind of performance stuff,
00:41:38.000 --> 00:41:38.120
right?
00:41:38.200 --> 00:41:39.980
And having people like that and stuff
00:41:40.100 --> 00:41:42.100
start to bring stuff out from Cinder and all that, right?
00:41:42.280 --> 00:41:42.360
Yeah.
00:41:42.980 --> 00:41:43.680
It's, it's,
00:41:43.900 --> 00:41:44.780
it's timelines.
00:41:45.000 --> 00:41:45.600
The other thing though,
00:41:46.060 --> 00:41:49.900
is Michael's not shown us what the JIT numbers are with the experimental
00:41:50.140 --> 00:41:50.240
JIT.
00:41:50.560 --> 00:41:51.520
So we'll also keep going.
00:41:51.620 --> 00:41:52.040
Let's keep going.
00:41:52.540 --> 00:41:52.920
Let's see.
00:41:53.320 --> 00:41:54.740
So yeah.
00:41:54.740 --> 00:41:55.440
So we've got the,
00:41:55.840 --> 00:41:57.860
the next graph is we've got the standard,
00:41:58.060 --> 00:41:59.160
which is just what you get when
00:41:59.160 --> 00:41:59.680
you write Python.
00:41:59.840 --> 00:42:02.520
Then you've got the experimental JIT, which you can turn on and the free threading.
00:42:02.820 --> 00:42:03.800
And this is single threaded.
00:42:04.020 --> 00:42:06.520
So the free threading will not get better,
00:42:06.960 --> 00:42:07.760
but if it doesn't get worse,
00:42:08.160 --> 00:42:08.580
that's actually
00:42:08.580 --> 00:42:09.400
a huge improvement.
00:42:09.800 --> 00:42:11.400
And I think that's actually the biggest takeaway
00:42:11.980 --> 00:42:13.980
from this one is for this Fibonacci thing.
00:42:14.460 --> 00:42:15.740
It really doesn't that much of a difference,
00:42:15.940 --> 00:42:17.340
but Python 3.13,
00:42:17.600 --> 00:42:18.640
free threading was,
00:42:18.780 --> 00:42:19.800
I don't know, 20% slower.
00:42:20.220 --> 00:42:23.320
And now free threading is actually just on par
00:42:23.700 --> 00:42:25.020
with regular CPython.
00:42:25.040 --> 00:42:25.320
That's great.
00:42:26.260 --> 00:42:27.460
That's actually really good.
00:42:27.580 --> 00:42:28.720
And the JIT, as Brett points out,
00:42:28.740 --> 00:42:29.720
is like 20% faster.
00:42:30.020 --> 00:42:31.340
Yeah, I think Nick brought it up
00:42:31.340 --> 00:42:32.120
with like the compatibility.
00:42:32.500 --> 00:42:34.720
Like PyPy had problems with importing
00:42:35.120 --> 00:42:36.300
some package you want to use.
00:42:36.740 --> 00:42:38.080
Now, even the folks over at EVE Online
00:42:38.200 --> 00:42:39.080
are like, we're fast enough.
00:42:39.320 --> 00:42:39.520
finally,
00:42:39.960 --> 00:42:41.540
let's just use the box Python.
00:42:42.380 --> 00:42:43.420
And now we've got all the benefits
00:42:43.580 --> 00:42:45.580
of a giant library of ecosystem stuff.
00:42:46.380 --> 00:42:46.700
Exactly.
00:42:46.860 --> 00:42:47.180
Guess what?
00:42:47.640 --> 00:42:48.220
If we upgrade,
00:42:48.620 --> 00:42:50.500
all right, let's go a little farther.
00:42:50.600 --> 00:42:51.300
So the next one is the bubble sort.
00:42:51.300 --> 00:42:52.380
That was always a sketchy path.
00:42:52.460 --> 00:42:55.020
Like they were on such an experimental version of Python
00:42:55.500 --> 00:42:56.400
with their whole production.
00:42:56.640 --> 00:42:57.220
That is impressive.
00:42:57.819 --> 00:42:58.140
Yeah.
00:42:58.420 --> 00:43:00.700
They stuck it out with Stackless for a long time.
00:43:00.960 --> 00:43:01.420
Long time.
00:43:01.780 --> 00:43:02.380
Long time.
00:43:02.720 --> 00:43:03.320
Until this year.
00:43:03.680 --> 00:43:04.900
Yeah, I just had them on Talk Python.
00:43:05.140 --> 00:43:05.660
So yeah.
00:43:06.060 --> 00:43:06.200
All right.
00:43:06.220 --> 00:43:08.720
The next one is the Fibonacci with four threads.
00:43:08.980 --> 00:43:10.580
I think this gets pretty interesting
00:43:10.920 --> 00:43:13.680
and it shows some really interesting improvements.
00:43:14.220 --> 00:43:16.200
So we've got maybe if you run four threads
00:43:16.410 --> 00:43:17.640
to answer the Fibonacci question
00:43:18.080 --> 00:43:19.920
compared to the others like JIT and standard,
00:43:20.200 --> 00:43:21.280
it's, I don't know,
00:43:21.620 --> 00:43:21.840
20,
00:43:22.080 --> 00:43:23.940
25% time it takes.
00:43:24.040 --> 00:43:24.880
So that's four times faster,
00:43:25.280 --> 00:43:26.740
which if you add four threads
00:43:26.920 --> 00:43:27.960
and you get four times faster,
00:43:28.300 --> 00:43:28.840
wow, that's good.
00:43:28.980 --> 00:43:29.380
That's pretty good.
00:43:29.660 --> 00:43:30.900
People who haven't done multi-threading before,
00:43:31.130 --> 00:43:33.680
you rarely get as many times improvement
00:43:33.900 --> 00:43:35.660
as you have CPUs you've added to it, right?
00:43:35.800 --> 00:43:37.300
There's a lot of coordination and other things.
00:43:37.740 --> 00:43:38.620
It is usually not linear.
00:43:38.700 --> 00:43:39.060
So,
00:43:39.380 --> 00:43:39.580
yeah,
00:43:40.100 --> 00:43:41.160
this is actually pretty impressive.
00:43:42.280 --> 00:43:52.140
Just shows like for the longest time is actually kind of amazing that the language like Python that is compared to like C or Java is not as fast,
00:43:52.300 --> 00:43:56.380
was able to like garner the attention and love of so many people.
00:43:56.940 --> 00:43:58.860
And it was good enough for so many things.
00:43:59.420 --> 00:44:03.880
And now it's just like getting better and better now. It's actually quite remarkable.
00:44:04.220 --> 00:44:04.640
Absolutely.
00:44:05.200 --> 00:44:10.820
And also the JIT from 3.14 to 3.15 has gotten quite a bit better as well.
00:44:11.060 --> 00:44:11.540
So that's
00:44:11.610 --> 00:44:12.000
pretty interesting.
00:44:12.580 --> 00:44:13.100
What else,
00:44:13.260 --> 00:44:14.980
what else do we got to take away from here? I don't know.
00:44:15.240 --> 00:44:15.940
I would say.
00:44:16.210 --> 00:44:19.720
What was it, Brett, who said like Python is like the second best choice for everything. I think
00:44:19.900 --> 00:44:20.580
that's not true anymore.
00:44:20.960 --> 00:44:21.160
Yeah.
00:44:21.410 --> 00:44:22.020
I don't think it's,
00:44:22.210 --> 00:44:22.640
I don't know.
00:44:23.040 --> 00:44:24.020
There's certainly.
00:44:24.120 --> 00:44:28.580
Well, your AI will probably always choose Python for certain projects.
00:44:28.920 --> 00:44:30.100
So it's really the first
00:44:30.280 --> 00:44:30.700
choice for everything.
00:44:30.740 --> 00:44:31.380
It's the first choice.
00:44:31.550 --> 00:44:31.680
Yeah.
00:44:32.060 --> 00:44:33.860
Yeah, it's head-to-head on JavaScript,
00:44:34.050 --> 00:44:35.440
or if you ask it to do a web thing,
00:44:35.490 --> 00:44:37.380
it probably does JavaScript if you don't guide it.
00:44:37.610 --> 00:44:39.220
But if you ask it to do any sort of data thing,
00:44:39.310 --> 00:44:40.140
it's definitely doing Python.
00:44:40.620 --> 00:44:42.720
Yeah, playwright is Python.
00:44:43.919 --> 00:44:47.300
And to be fair to PyPy, right,
00:44:47.450 --> 00:44:49.260
they also have to keep up with the language,
00:44:49.570 --> 00:44:49.660
right,
00:44:49.860 --> 00:44:50.520
intended to change,
00:44:50.720 --> 00:44:53.620
hence why they're not on 3.14 or 3.15,
00:44:53.840 --> 00:44:57.300
while the built-in JIT just gets to piggyback on all the other work.
00:44:58.059 --> 00:44:58.780
Yeah, 100%.
00:44:58.800 --> 00:45:01.620
JIT comparison is not a direct one-to-one that way because of that.
00:45:01.820 --> 00:45:06.440
I also want to give a quick shout out to some of the new things we got that are utterly untested here.
00:45:06.780 --> 00:45:08.000
This is, I wrote one function,
00:45:08.240 --> 00:45:09.860
and in that one function,
00:45:10.120 --> 00:45:12.700
I ran it a bunch, sometimes with threads, sometimes with JIT,
00:45:12.880 --> 00:45:13.280
sometimes without,
00:45:13.540 --> 00:45:14.460
and it did a thing,
00:45:14.660 --> 00:45:14.780
right?
00:45:15.100 --> 00:45:24.340
What we don't see is we don't see the effect of lazy imports for really large applications or things that need super quick startup time, and then they're gone like a CLI tool.
00:45:24.720 --> 00:45:31.500
We don't see the specialized and adaptive interpreter or even the JIT really get to kick in very much because it's one or two functions.
00:45:31.740 --> 00:45:33.560
if you had 10,000 functions
00:45:34.040 --> 00:45:35.680
and it was a big, interesting application,
00:45:36.120 --> 00:45:37.960
those could also really start to make a difference.
00:45:38.860 --> 00:45:39.880
So the PSA,
00:45:40.060 --> 00:45:40.200
guys,
00:45:40.760 --> 00:45:42.740
the PSA is just upgrade your Python
00:45:43.000 --> 00:45:45.560
and you get performance for lunch.
00:45:45.560 --> 00:45:45.780
Oh, yeah.
00:45:46.180 --> 00:45:46.920
You will save money.
00:45:47.340 --> 00:45:47.540
Yeah.
00:45:47.920 --> 00:45:49.200
This is like legitimate free lunch.
00:45:49.560 --> 00:45:52.160
Yeah, no, I've had this discussion with people
00:45:52.420 --> 00:45:54.540
like when their managers don't want to punt
00:45:54.680 --> 00:45:55.700
and put off upgrading,
00:45:56.020 --> 00:45:57.340
the way to sell it to management is
00:45:57.680 --> 00:45:58.460
you will save money.
00:45:58.780 --> 00:45:59.700
Python will be faster.
00:45:59.800 --> 00:46:01.640
we'll use less memory very likely as well.
00:46:02.100 --> 00:46:03.720
And thus we will do more with less.
00:46:04.080 --> 00:46:05.260
So either we can scale higher
00:46:05.740 --> 00:46:07.420
or we can do the same things with less machines.
00:46:07.980 --> 00:46:09.700
So why not let us upgrade,
00:46:10.000 --> 00:46:10.060
please?
00:46:10.520 --> 00:46:11.400
So it's less of a pain
00:46:11.520 --> 00:46:13.740
because we only get to upgrade every two or four or five years.
00:46:14.040 --> 00:46:15.500
And it's a big hassle.
00:46:15.580 --> 00:46:16.920
It's like, no, upgrade continuously
00:46:16.960 --> 00:46:17.800
and you'll keep getting these ones.
00:46:18.100 --> 00:46:18.340
Well,
00:46:18.560 --> 00:46:21.060
and your libraries get far quicker too.
00:46:21.360 --> 00:46:24.040
Like Napari using lazy imports
00:46:24.240 --> 00:46:26.700
is far better than on a version
00:46:26.900 --> 00:46:28.520
that can't use lazy imports.
00:46:28.620 --> 00:46:28.940
So,
00:46:29.590 --> 00:46:29.720
yeah.
00:46:30.200 --> 00:46:36.100
And to quickly touch on what Michael said about the difficulty of judging performance on these micro benchmarks.
00:46:36.630 --> 00:46:36.760
Right.
00:46:36.810 --> 00:46:41.880
This is one reason PyPerformance that is used for benchmarking CPython and Python in general,
00:46:42.320 --> 00:46:53.620
tries to do benchmarks that are pulled from real world code and tries to be somewhat representative of actual work close to an extent while not taking hours and hours and hours to run.
00:46:53.960 --> 00:46:58.560
But another point that actually came up during the development 3.15 was the garbage collector,
00:46:59.020 --> 00:46:59.100
right?
00:46:59.270 --> 00:47:01.580
There was the incremental garbage collector put in.
00:47:01.940 --> 00:47:04.820
And we found out after people started to test with it,
00:47:05.140 --> 00:47:07.500
that it actually didn't work in large,
00:47:07.740 --> 00:47:11.280
certain key workloads and actually led to larger garbage collector pauses.
00:47:11.480 --> 00:47:14.740
Because I don't know how many people know this, but Python kind of has two garbage collectors,
00:47:14.960 --> 00:47:15.020
right?
00:47:15.100 --> 00:47:16.440
There's reference counting for most stuff,
00:47:16.700 --> 00:47:17.940
but then we have a garbage collector look for
00:47:18.060 --> 00:47:20.160
cycles because reference counting can't handle cycles.
00:47:20.700 --> 00:47:22.380
And we've had a generational one for a long time.
00:47:22.740 --> 00:47:26.840
and incremental will get to less pauses and hopefully better performance but we found out
00:47:26.840 --> 00:47:32.840
the one we did actually did make things better for most people but for certain people the the
00:47:33.160 --> 00:47:37.840
degenerate cases like the really bad edge case ones it was really slow and bad so we actually had to
00:47:37.900 --> 00:47:43.080
roll it back and um and mark shanning for instance currently has a proposal on how to kind of fix
00:47:43.200 --> 00:47:46.880
that but there's another point that it's really hard to measure unless people actually do this
00:47:46.940 --> 00:47:52.460
which is why we will always say as a psa from the python dev team please test the alphas and the
00:47:52.480 --> 00:47:52.820
And please,
00:47:53.130 --> 00:47:56.880
please at least test the release candidates on actual workloads to let us know
00:47:56.970 --> 00:47:58.080
where things may have gone wrong.
00:47:58.320 --> 00:48:01.360
Because if someone hadn't tested that and told us ahead of time, we would have shipped
00:48:01.900 --> 00:48:03.300
and we actually did in 3.14,
00:48:04.220 --> 00:48:06.100
a garbage collector that needed to get rolled back.
00:48:06.260 --> 00:48:08.140
So it just didn't hit people really badly.
00:48:08.420 --> 00:48:08.660
Absolutely.
00:48:09.000 --> 00:48:11.960
All right, let's have Carol close it out.
00:48:12.980 --> 00:48:14.340
And our favorite topic,
00:48:15.160 --> 00:48:17.900
artificial intelligence and tools around it.
00:48:18.980 --> 00:48:19.020
So,
00:48:19.740 --> 00:48:19.900
you know,
00:48:20.080 --> 00:48:24.840
after being in the scientific ecosystem and data science and Jupyter ecosystem,
00:48:25.640 --> 00:48:25.820
you know,
00:48:26.000 --> 00:48:28.400
I've watched the evolution of,
00:48:28.560 --> 00:48:29.700
you know, machine learning,
00:48:30.100 --> 00:48:30.560
deep learning.
00:48:31.110 --> 00:48:32.700
We call AI now.
00:48:33.840 --> 00:48:40.540
And one of the things Paul Everitt and I have been sort of talking over the past year about,
00:48:41.040 --> 00:48:41.120
hey,
00:48:41.480 --> 00:48:46.300
you know, so much of it is built on top of the work that we've done with Python,
00:48:46.760 --> 00:48:51.620
that it would be great to have a community benefit from it,
00:48:52.060 --> 00:48:54.000
not just large corporations
00:48:55.500 --> 00:48:58.360
steering the future of these tools.
00:48:58.880 --> 00:49:00.560
And so back in March,
00:49:01.860 --> 00:49:03.720
Georgie and Paul and I sat down and we
00:49:03.880 --> 00:49:09.400
started talking about, hey, how could we use more local capacity?
00:49:09.690 --> 00:49:12.140
How could we improve privacy,
00:49:13.180 --> 00:49:13.640
security,
00:49:14.420 --> 00:49:18.300
not leaking your data out to other services.
00:49:19.040 --> 00:49:23.140
And Paul did a keynote back at
00:49:23.380 --> 00:49:27.140
EuroPython this year and introduced what we're calling Satyrn.
00:49:27.780 --> 00:49:28.760
And really,
00:49:28.970 --> 00:49:31.360
Satyrn is looking at
00:49:31.760 --> 00:49:33.520
doing AI your way,
00:49:33.980 --> 00:49:37.820
which doesn't exclude the use of foundational models,
00:49:38.460 --> 00:49:39.960
but really emphasizes
00:49:39.960 --> 00:49:47.800
is that there's a spectrum of ways that you can use large language models and agents to suit your
00:49:48.120 --> 00:49:50.700
particular workflow because one size does not fit all.
00:49:51.020 --> 00:49:54.200
And from that EuroPython keynote,
00:49:54.390 --> 00:49:54.760
he had a
00:49:54.880 --> 00:49:55.500
call to action,
00:49:56.720 --> 00:49:58.920
mostly for the Europe community,
00:49:59.380 --> 00:50:02.860
but it has expanded out from that to kind of create
00:50:02.940 --> 00:50:10.500
a collective of individuals that are passionate about making it Python first and trying to make
00:50:10.780 --> 00:50:12.600
transparent and trusted AI.
00:50:13.600 --> 00:50:18.760
So I've kind of helped with the effort to kind of get the scaffolding in
00:50:19.000 --> 00:50:19.280
place.
00:50:19.600 --> 00:50:26.540
And I'm happy to say that when 3.15 got released, there was also a model that up on
00:50:26.600 --> 00:50:35.280
hugging face that the Satyrn team has trained on 315 that can run locally as well as on other
00:50:35.540 --> 00:50:35.640
things.
00:50:36.140 --> 00:50:41.120
And I think one of the key things is while we look at local first,
00:50:41.650 --> 00:50:43.100
we're also looking at
00:50:43.480 --> 00:50:43.940
trust first.
00:50:44.500 --> 00:50:44.720
And,
00:50:45.260 --> 00:50:52.440
you know, I could go back to my icon keynote back in 2023 when ChatGPT was still
00:50:52.340 --> 00:50:52.700
in beta.
00:50:53.180 --> 00:50:55.880
And one of the things that bothered me was,
00:50:56.170 --> 00:50:59.260
do I trust this large language model?
00:50:59.570 --> 00:50:59.820
Do I
00:51:00.000 --> 00:51:01.080
trust how it was trained?
00:51:01.310 --> 00:51:02.460
Do I trust it,
00:51:02.800 --> 00:51:03.060
you know,
00:51:03.300 --> 00:51:04.340
to be unbiased?
00:51:04.720 --> 00:51:07.100
And while there's a lot of value
00:51:07.340 --> 00:51:07.560
in it,
00:51:07.750 --> 00:51:11.620
you still have to verify that it's doing what you think it's doing.
00:51:12.100 --> 00:51:13.620
And so I think having
00:51:14.040 --> 00:51:15.920
more options where,
00:51:16.600 --> 00:51:18.580
you know, you don't always need a sledgehammer.
00:51:18.820 --> 00:51:20.340
Sometimes a hammer is good enough.
00:51:20.680 --> 00:51:21.880
And in this case,
00:51:22.120 --> 00:51:25.860
sometimes you can get a lot of good stuff the last six months out of local models.
00:51:26.340 --> 00:51:26.640
And,
00:51:27.540 --> 00:51:27.780
you know,
00:51:28.050 --> 00:51:35.460
the other key component is one of the keys that has made Python so successful is the language,
00:51:36.090 --> 00:51:37.560
the ecosystem of libraries,
00:51:38.060 --> 00:51:44.300
but also the huge commitment the community has about sharing learning materials,
00:51:44.860 --> 00:51:45.900
educating each other,
00:51:46.760 --> 00:51:47.580
spreading the knowledge.
00:51:48.000 --> 00:51:54.040
And if all Satyrn did was provide these education and learning opportunities,
00:51:54.630 --> 00:51:58.580
which is a big part of what we're taking from Jupyter,
00:51:58.920 --> 00:52:01.800
Jupyter really helped accelerate learning,
00:52:02.060 --> 00:52:03.840
sharing learning materials with folks.
00:52:04.120 --> 00:52:04.540
And,
00:52:05.030 --> 00:52:05.380
you know,
00:52:05.760 --> 00:52:09.300
there's a team around sharing educational content,
00:52:09.710 --> 00:52:11.380
both created by the team,
00:52:11.760 --> 00:52:15.260
as well as highlighting things that are available within the community.
00:52:15.470 --> 00:52:17.120
So it's still in the early stages,
00:52:17.620 --> 00:52:20.780
but I think there's good energy behind it.
00:52:21.060 --> 00:52:24.360
And I would love to see it grow more and more.
00:52:24.760 --> 00:52:37.200
And the reason we kind of started in Europe was we felt like the continent as a whole was more focused on security,
00:52:37.580 --> 00:52:37.740
privacy,
00:52:39.380 --> 00:52:41.140
and the goal impact of AI.
00:52:41.960 --> 00:52:43.140
Well, and being a European,
00:52:43.540 --> 00:52:50.720
how much do you want to say our entire AI future hangs on large American tech companies or Chinese companies?
00:52:51.420 --> 00:52:53.500
Maybe we should have some say in this, something like that, right?
00:52:53.640 --> 00:52:54.020
Yeah,
00:52:54.420 --> 00:52:54.860
well, I think,
00:52:55.040 --> 00:52:57.000
I mean, everybody should have a say in it.
00:52:57.200 --> 00:52:59.180
And I think, you know,
00:52:59.600 --> 00:53:01.560
some of the large companies,
00:53:01.940 --> 00:53:02.500
let's face it,
00:53:02.680 --> 00:53:08.440
they're beholden to their shareholders or investors to maximize profits,
00:53:08.960 --> 00:53:16.280
which doesn't always align with maximizing responsibility to the community and ethics and other things.
00:53:16.400 --> 00:53:16.720
So,
00:53:17.660 --> 00:53:20.160
you know, I think alternatives are always good.
00:53:20.380 --> 00:53:22.820
It helps push ecosystems forward.
00:53:23.140 --> 00:53:28.820
There's a lot of great stuff happening in bioscience and medical applications,
00:53:29.520 --> 00:53:34.740
particularly with rare diseases that the foundational models have been hugely helpful for.
00:53:35.220 --> 00:53:35.940
And so,
00:53:36.480 --> 00:53:38.140
you know, it's not one or the other.
00:53:39.000 --> 00:53:41.720
There's a spectrum of use cases.
00:53:42.300 --> 00:53:44.220
There should be a spectrum of tools and approaches.
00:53:44.840 --> 00:53:48.480
And as we navigate the understanding of it,
00:53:48.640 --> 00:53:50.760
sharing that becomes more and more important,
00:53:51.160 --> 00:53:52.440
which Python bites.
00:53:52.980 --> 00:53:55.740
And Python to me for sharing this on a regular basis.
00:53:56.280 --> 00:53:58.020
I love the fact there's two models.
00:53:58.120 --> 00:54:06.320
You've got the smaller Ornith model and then the other one based on that Quinn 3827B powerhouse of a local model.
00:54:06.580 --> 00:54:07.660
I can't wait to try both of them.
00:54:08.020 --> 00:54:08.160
Yeah.
00:54:08.320 --> 00:54:09.520
I mean, it's pretty interesting.
00:54:09.680 --> 00:54:13.880
And there's teams that, if you join the Discord,
00:54:14.260 --> 00:54:18.320
that are working on these, how do you test and train?
00:54:19.580 --> 00:54:26.560
And so we're trying to be open by default and the information and the workflows.
00:54:26.580 --> 00:54:26.900
So,
00:54:27.420 --> 00:54:28.540
you know, definitely reach out.
00:54:28.920 --> 00:54:31.780
And yeah, it's got some good energy behind it.
00:54:32.020 --> 00:54:35.140
Are there other languages who are interested in participating?
00:54:36.360 --> 00:54:37.120
I don't know.
00:54:37.450 --> 00:54:38.660
I mean, there might be.
00:54:39.010 --> 00:54:41.640
I mean, I could see maybe Rust having some interest,
00:54:42.140 --> 00:54:46.920
but for now we've kind of scoped it to Python and,
00:54:47.840 --> 00:54:48.020
you know,
00:54:48.380 --> 00:54:50.040
trying to train something specifically
00:54:50.060 --> 00:54:56.740
on Python 3.15 and the use cases that, you know, are new with 3.15 was something that
00:54:56.840 --> 00:54:57.680
was really interesting.
00:54:58.030 --> 00:54:59.100
But that's a really good question.
00:54:59.500 --> 00:55:01.500
I wonder where my R fellas,
00:55:02.080 --> 00:55:03.760
like the R language are,
00:55:03.920 --> 00:55:05.960
that would be a good language to add under
00:55:06.460 --> 00:55:06.840
the Satyrn.
00:55:06.840 --> 00:55:07.220
You know,
00:55:07.400 --> 00:55:07.940
yeah.
00:55:08.630 --> 00:55:09.000
I mean,
00:55:09.320 --> 00:55:09.700
in fact,
00:55:10.600 --> 00:55:12.920
Posit is having sort of a hackathon,
00:55:13.400 --> 00:55:15.460
I think, in November that I'm going
00:55:15.640 --> 00:55:15.760
to.
00:55:15.810 --> 00:55:19.740
So that might be a great thing to kind of kick around the tires on.
00:55:19.940 --> 00:55:20.140
Yeah,
00:55:20.510 --> 00:55:21.640
I want you to say, personally,
00:55:21.860 --> 00:55:26.620
I've always had trouble running local AI models,
00:55:27.270 --> 00:55:34.700
mainly because sometimes it was always hard to know which models could actually fit into my consumer-grade hardware.
00:55:35.380 --> 00:55:38.780
And so navigating that has always been not the fun part.
00:55:39.050 --> 00:55:45.300
So I'm really looking forward to participating in this because I believe you guys will probably do a better job of discussing.
00:55:45.780 --> 00:55:47.780
These are the kind of hardware you can run.
00:55:48.140 --> 00:55:50.360
This is the kind of models that can run on that hardware.
00:55:50.920 --> 00:55:52.040
This is some use cases,
00:55:52.260 --> 00:55:55.120
something as simple as categorizing or,
00:55:55.380 --> 00:55:55.960
you know,
00:55:56.360 --> 00:56:00.620
categorizing like your files to like helping you run a small,
00:56:01.120 --> 00:56:02.640
like automated business or something.
00:56:02.820 --> 00:56:04.820
That'll be cool to see what you guys do.
00:56:05.220 --> 00:56:09.480
Well, and looping back to the start where you were talking about Marimo,
00:56:09.840 --> 00:56:16.480
we've actually used some of the Marimo hub and the GPU access there to do some of this training.
00:56:17.320 --> 00:56:18.060
So,
00:56:18.260 --> 00:56:21.140
you know, so it doesn't have to be just your local laptop.
00:56:21.380 --> 00:56:21.980
It can be,
00:56:22.440 --> 00:56:22.640
you know,
00:56:23.000 --> 00:56:24.580
something that is a little beefier.
00:56:25.380 --> 00:56:26.900
Yeah, and looking at the size of the models,
00:56:27.120 --> 00:56:28.100
they're not ginormous.
00:56:28.200 --> 00:56:28.300
No.
00:56:28.360 --> 00:56:29.760
You know, they're 10 billion parameters,
00:56:30.200 --> 00:56:30.940
28 billion parameters.
00:56:31.240 --> 00:56:34.060
These are plausible on decent local machines.
00:56:34.540 --> 00:56:34.740
Yeah.
00:56:35.060 --> 00:56:38.980
I mean, they definitely work on my GPU Linux box.
00:56:40.100 --> 00:56:42.800
You can get it to work on a Mac as well.
00:56:42.880 --> 00:56:44.780
It's a little bit, you know,
00:56:45.060 --> 00:56:45.580
a little bit harder.
00:56:45.980 --> 00:56:47.240
Got to submit it to the app store.
00:56:47.280 --> 00:56:52.400
see if they approve it yeah no i think you just have to get the mlx you know version of the training
00:56:52.540 --> 00:56:56.980
done so you can accelerate it on the on the max yeah luckily i've got a Linux box here too so let's
00:56:57.000 --> 00:57:01.860
throw it on there cool let us know what you find out i just realized we're running out of planets
00:57:02.100 --> 00:57:10.320
to rename with a y i did i was not the namer uh that would be paul no i'm just glad you said
00:57:10.960 --> 00:57:16.640
after jupiter yeah i mean uranus is like one of the last ones with the u in it and yeah yeah
00:57:16.700 --> 00:57:21.380
number out yeah yeah yeah yeah good point brett it's brett it's gonna be okay we're going out to
00:57:21.380 --> 00:57:29.860
the orc cloud yeah fine yeah s2 s7 y5 i know you thought that was a u but no it's the y one
00:57:30.360 --> 00:57:35.460
it'll be good it'll be good all right well this is super interesting and the naming i guess
00:57:35.720 --> 00:57:42.920
probably came off of jupiter uh that i think when paul was looking at it yeah i mean definitely some
00:57:42.940 --> 00:57:46.960
of the things that Jupyter did in terms of accelerating the community.
00:57:47.780 --> 00:57:48.700
He wanted,
00:57:49.360 --> 00:57:49.540
you know,
00:57:49.760 --> 00:57:53.720
that ability to share knowledge as well as build things.
00:57:54.220 --> 00:57:54.600
And,
00:57:54.980 --> 00:57:55.900
you know,
00:57:56.320 --> 00:57:58.020
the Y just seemed to make
00:57:58.120 --> 00:58:01.620
sense. Plus there are other Satyrns out there, Satyrn AIs and whatnot.
00:58:01.830 --> 00:58:03.580
So why not add the Y?
00:58:03.700 --> 00:58:03.800
Yeah.
00:58:03.970 --> 00:58:05.320
Why not? Why not? Cool.
00:58:05.560 --> 00:58:07.460
Well, we're just about out of time,
00:58:07.960 --> 00:58:09.260
but I've got a couple of
00:58:09.280 --> 00:58:14.200
extras i'm gonna trim mine back but i know brett you want to there's some little release or
00:58:14.290 --> 00:58:19.900
something you wanted to talk about what is this i think you already talked about it yeah 315.0
00:58:20.100 --> 00:58:26.300
finals gone out so 310 also hit eol about a week prior i think two weeks prior i can't remember
00:58:26.720 --> 00:58:33.560
uh but yeah after the unfortunate new tradition of having a third rc happened um finals out it's
00:58:33.580 --> 00:58:41.240
good it's done uh obviously we're already working on 3.15.1 which should hopefully come out typically
00:58:41.540 --> 00:58:45.580
historically we do it in november um but then we'll be on the usual two-month cadence for
00:58:45.920 --> 00:58:51.080
bugfish releases but they're 15s out um a lot of great stuff in it as i know has been covered here
00:58:51.380 --> 00:58:56.380
and download however you download your latest python i'm gonna give a huge shout out to trey
00:58:56.400 --> 00:59:02.020
hunter who has some really good what's new in 315 that,
00:59:02.360 --> 00:59:02.560
you know,
00:59:02.940 --> 00:59:04.920
web developers and folks that
00:59:05.100 --> 00:59:10.680
are maybe not as focused on some of the scientific benefits for some of the performance stuff.
00:59:11.100 --> 00:59:12.360
It's really well done.
00:59:12.540 --> 00:59:14.800
And Barry Warsaw's what's newt,
00:59:15.000 --> 00:59:16.140
if you want to do a dungeon
00:59:16.420 --> 00:59:17.160
crawler version of it.
00:59:17.320 --> 00:59:18.700
That was so awesome.
00:59:19.100 --> 00:59:20.460
I really enjoyed that.
00:59:20.600 --> 00:59:21.760
That is fun. It was really fun.
00:59:22.220 --> 00:59:22.380
Agreed.
00:59:22.520 --> 00:59:22.620
Yeah.
00:59:22.800 --> 00:59:23.200
I was thinking,
00:59:23.640 --> 00:59:26.220
could I make a visual version to overlay on that? I don't know.
00:59:26.340 --> 00:59:26.680
We'll see.
00:59:26.980 --> 00:59:28.120
I will not be doing that.
00:59:28.560 --> 00:59:30.780
But I do want to give a quick shout out to this as an extra.
00:59:30.900 --> 00:59:31.800
Have you all seen this?
00:59:32.820 --> 00:59:33.280
This is insane.
00:59:33.900 --> 00:59:35.740
This craft apps thing.
00:59:35.960 --> 00:59:37.800
I think the guy's name is Ben.
00:59:38.040 --> 00:59:38.820
I thought it hit the news.
00:59:39.160 --> 00:59:39.260
Yeah.
00:59:39.660 --> 00:59:39.700
Yeah.
00:59:40.060 --> 00:59:43.960
This guy had a big falling out with Adobe over the subscription stuff.
00:59:44.140 --> 00:59:44.220
Surprise.
00:59:44.880 --> 00:59:45.440
And said, well,
00:59:45.620 --> 00:59:46.320
you know what I'm going to do?
00:59:46.600 --> 00:59:47.880
I'm going to recreate Photoshop.
00:59:48.920 --> 00:59:50.700
And I don't even know the apps that well.
00:59:50.760 --> 00:59:51.020
Let me see.
00:59:51.340 --> 00:59:52.120
I'm going to recreate Photoshop.
00:59:52.740 --> 00:59:55.120
And I'm going to create Illustrator.
00:59:55.840 --> 00:59:57.760
And a bunch of others,
00:59:58.960 --> 01:00:01.340
Lightroom, I don't know, a bunch of these, Acrobat,
01:00:01.710 --> 01:00:02.460
and recreated them.
01:00:02.890 --> 01:00:03.600
A whole creative suite.
01:00:04.160 --> 01:00:04.440
Almost.
01:00:04.780 --> 01:00:05.520
It's missing Audition.
01:00:05.650 --> 01:00:07.340
I can't wait for him to do Audition.
01:00:07.460 --> 01:00:07.820
Let's go.
01:00:08.440 --> 01:00:11.940
Because I pay a ton of money to edit this podcast and other stuff with Audition.
01:00:12.160 --> 01:00:13.100
But yesterday,
01:00:13.410 --> 01:00:15.780
when I was like, I'm going to throw this up here as a thing they're talking about.
01:00:16.180 --> 01:00:16.720
There were 12.
01:00:17.100 --> 01:00:17.760
Today is 13.
01:00:18.739 --> 01:00:21.520
And I got to check real quick and see what the 13th is.
01:00:21.570 --> 01:00:22.980
But it has Microsoft Word,
01:00:23.280 --> 01:00:23.740
PowerPoint,
01:00:24.460 --> 01:00:24.860
and Excel.
01:00:25.540 --> 01:00:27.040
I got the little deck craft thing.
01:00:27.420 --> 01:00:28.300
I know it's not the same,
01:00:28.640 --> 01:00:30.400
but I opened up my talk that I gave
01:00:30.530 --> 01:00:32.580
with all the animations and gradients and stuff
01:00:32.960 --> 01:00:35.900
for PiBay and it presented it just fine.
01:00:36.130 --> 01:00:36.540
I don't know.
01:00:36.810 --> 01:00:38.040
I don't know that it edits as well.
01:00:38.180 --> 01:00:39.040
But anyway, I just,
01:00:39.220 --> 01:00:39.900
I think,
01:00:40.090 --> 01:00:41.800
I wanted to give this a bit of a shout out
01:00:42.040 --> 01:00:42.720
because it's just,
01:00:42.940 --> 01:00:44.080
it's a weird time.
01:00:44.190 --> 01:00:44.720
And I think this,
01:00:44.980 --> 01:00:45.100
you know,
01:00:45.290 --> 01:00:47.780
looking back 10 years and looking forward 10 years,
01:00:48.020 --> 01:00:49.360
like this is kind of an interesting thing
01:00:49.470 --> 01:00:50.680
at the inflection point.
01:00:50.940 --> 01:00:52.280
Well, and especially because they talked about
01:00:52.280 --> 01:00:54.100
how they tried to do this as clean room,
01:00:54.320 --> 01:00:54.420
right?
01:00:54.600 --> 01:00:56.300
I think there's no source code to look at here.
01:00:56.390 --> 01:00:56.680
They literally,
01:00:56.870 --> 01:00:57.220
I think,
01:00:57.450 --> 01:00:59.360
threw a model at it and said,
01:01:00.299 --> 01:01:02.140
here's the thing I want you to reimplement.
01:01:02.520 --> 01:01:03.380
Go reimplement it.
01:01:03.800 --> 01:01:05.300
And here's the UI.
01:01:05.620 --> 01:01:06.940
Here's its feature list to make that.
01:01:07.839 --> 01:01:09.900
Go read the publicity material,
01:01:10.060 --> 01:01:10.140
right?
01:01:10.580 --> 01:01:13.520
There's a lot of documentation about how Photoshop is supposed to work.
01:01:13.920 --> 01:01:15.660
And if you give it access on the browser version,
01:01:15.860 --> 01:01:18.140
you can click through it and all that and crank away at it.
01:01:18.260 --> 01:01:21.760
Now, I'd be kind of curious as to how much their token budget was to pull that off.
01:01:22.020 --> 01:01:22.740
Very much curious.
01:01:23.200 --> 01:01:24.120
High. Very high.
01:01:24.360 --> 01:01:25.220
Very high, I'm sure.
01:01:26.360 --> 01:01:30.120
Because Cloud re-implemented a C compiler for the Linux kernel,
01:01:30.240 --> 01:01:33.040
and it cost them hundreds of thousands of dollars for something.
01:01:34.200 --> 01:01:34.320
Wow.
01:01:34.620 --> 01:01:38.680
But it's still kind of cool that this is what you theoretically can do
01:01:38.800 --> 01:01:41.140
with appropriate budget with LLMs.
01:01:41.500 --> 01:01:43.820
We talked about way back when.
01:01:44.920 --> 01:01:45.060
Yeah.
01:01:45.440 --> 01:01:48.100
I mean, way back to March, we talked about a clean room rewrite,
01:01:49.300 --> 01:01:50.980
and this was for Chardet.
01:01:51.380 --> 01:01:51.600
Yes.
01:01:52.060 --> 01:01:54.240
And this was like a big to-do.
01:01:54.410 --> 01:01:55.660
And this was just a library.
01:01:55.860 --> 01:01:59.080
Now we're like, oh, let's just redo giant suites of apps.
01:01:59.430 --> 01:01:59.660
You know?
01:02:00.150 --> 01:02:04.680
Yeah, it's a very interesting world we are entering for software.
01:02:05.360 --> 01:02:05.800
Very,
01:02:06.400 --> 01:02:11.520
I think a lot of the companies that their software was their moats
01:02:11.670 --> 01:02:15.220
because they put so much investment to it
01:02:15.450 --> 01:02:17.500
and the time it would take to reimplement it,
01:02:18.820 --> 01:02:19.700
deter competitors.
01:02:20.400 --> 01:02:20.900
But with AI,
01:02:21.400 --> 01:02:22.440
it's very interesting.
01:02:22.580 --> 01:02:25.440
Now, somebody could create a DaVinci Resolve
01:02:25.820 --> 01:02:28.720
specific to their own podcasting editing needs,
01:02:28.750 --> 01:02:31.080
and they don't need DaVinci Resolve
01:02:31.220 --> 01:02:33.580
or all the other ones that exist.
01:02:34.300 --> 01:02:35.640
So it's very interesting,
01:02:36.500 --> 01:02:39.480
the era of personal software we're entering into.
01:02:39.640 --> 01:02:40.000
Absolutely.
01:02:40.950 --> 01:02:41.880
Even if I never use this,
01:02:41.950 --> 01:02:43.560
I hope this puts pressure on companies
01:02:43.570 --> 01:02:45.220
to be more on top of things,
01:02:45.510 --> 01:02:46.100
newer versions,
01:02:46.280 --> 01:02:46.860
less expensive.
01:02:47.660 --> 01:02:50.060
Yeah, and I think for desktop software specifically,
01:02:50.380 --> 01:02:57.140
right where you can have where the actual desktop app gives the model something to work against to
01:02:57.340 --> 01:03:02.900
verify that it's working appropriately and the outcomes are what you expect is of versus like
01:03:03.200 --> 01:03:07.460
i'm going to re-implement slack or something it's like well there's all back end on that one that's
01:03:07.560 --> 01:03:12.400
way more complicated to try to recreate just based on how slack looks on the front end but for
01:03:13.100 --> 01:03:17.220
photoshop on this desktop right once again if you've got the token budget it can just turn away
01:03:17.240 --> 01:03:20.780
for quite a while and eventually just get probably a good enough axillin.
01:03:21.110 --> 01:03:21.380
I mean,
01:03:21.760 --> 01:03:22.280
or you just go use
01:03:22.380 --> 01:03:22.580
GIMP.
01:03:22.850 --> 01:03:23.120
I mean,
01:03:24.060 --> 01:03:24.120
yeah.
01:03:24.520 --> 01:03:27.980
I mean, how many features do you use of any given app? Probably 10%, right? If
01:03:27.980 --> 01:03:29.100
you just say I'm building it for me.
01:03:29.500 --> 01:03:31.580
Yeah. Like to Nick's point, just make it for you. Yep.
01:03:31.900 --> 01:03:32.020
All
01:03:32.040 --> 01:03:32.120
right.
01:03:32.300 --> 01:03:32.400
Well,
01:03:32.760 --> 01:03:36.300
that's enough of this, but I do think it's a really bizarre and interesting thing that
01:03:36.410 --> 01:03:39.400
happened this week. Anyone else got something I want to shout out before we get to the joke?
01:03:39.660 --> 01:03:41.740
I got a real time update for Nick.
01:03:42.200 --> 01:03:45.380
Nick asked about how he could know what models he could run
01:03:45.680 --> 01:03:46.520
on his hardware.
01:03:47.260 --> 01:03:48.820
I've got the screen up here for
01:03:49.779 --> 01:03:51.400
llmfit.org, and that's actually
01:03:51.480 --> 01:03:53.240
a TUI app that you can
01:03:53.900 --> 01:03:55.420
just load up. It detects your
01:03:55.660 --> 01:03:55.840
hardware.
01:03:56.130 --> 01:03:57.460
So, Michael, if you wanted to put that
01:03:57.600 --> 01:03:58.120
up on the screen.
01:03:58.400 --> 01:03:59.460
All right, give me something to search for.
01:03:59.540 --> 01:04:00.980
What am I looking for? No, I shared.
01:04:01.070 --> 01:04:01.780
No, I shared it already.
01:04:02.060 --> 01:04:02.800
Oh, your screen.
01:04:03.130 --> 01:04:04.000
Yeah, my screen.
01:04:05.200 --> 01:04:05.500
There we go.
01:04:06.070 --> 01:04:06.160
So,
01:04:06.450 --> 01:04:07.000
it detects
01:04:07.050 --> 01:04:07.500
your hardware.
01:04:08.060 --> 01:04:08.940
It loads up a whole bunch
01:04:08.950 --> 01:04:10.020
of models from different providers,
01:04:10.340 --> 01:04:10.820
like Olama,
01:04:11.160 --> 01:04:11.660
Lama CPP,
01:04:12.120 --> 01:04:12.860
MLX, Docker
01:04:13.040 --> 01:04:13.960
Runner Models, LM Studios,
01:04:14.380 --> 01:04:15.360
and
01:04:15.380 --> 01:04:20.540
you just filter for what models would run best and give you scores so you can actually see where it
01:04:20.540 --> 01:04:21.360
might be better fits.
01:04:22.160 --> 01:04:25.620
I mean be careful you're downloading potentially random models from
01:04:25.820 --> 01:04:30.020
potentially random places so you probably want to be careful which providers you pull those models
01:04:30.200 --> 01:04:34.940
in from but it's a cool little tool to see like what what actually would perform and is there a
01:04:34.980 --> 01:04:39.460
better version of that model that I'm already using that I should be using based on like quantization
01:04:39.980 --> 01:04:45.340
and the MLX optimization all those kinds of pieces so I thought that'd be pretty cool for folks who
01:04:45.360 --> 01:04:46.420
what model should I run?
01:04:46.840 --> 01:04:48.700
And the other one I got on my extras is the,
01:04:49.140 --> 01:04:50.380
my standard uv report,
01:04:50.920 --> 01:04:53.400
UV 0.13 makes Python 3.15,
01:04:53.930 --> 01:04:54.280
the default.
01:04:54.900 --> 01:04:56.520
So we keep it right up.
01:04:56.760 --> 01:04:57.000
Awesome.
01:04:57.200 --> 01:05:01.280
I've already run uv Python install 3.15, dash,
01:05:01.450 --> 01:05:01.540
dash,
01:05:01.800 --> 01:05:01.920
default,
01:05:02.160 --> 01:05:02.680
I'm good to go.
01:05:02.960 --> 01:05:03.740
Ooh, I need to do that.
01:05:04.680 --> 01:05:05.720
That way if you just type Python,
01:05:05.850 --> 01:05:07.680
it falls to that one rather than some other system.
01:05:07.720 --> 01:05:08.260
That's what I want.
01:05:08.700 --> 01:05:09.620
Or if you're on Windows,
01:05:09.830 --> 01:05:10.520
use the PyManager,
01:05:10.660 --> 01:05:12.780
just type PyManager install 3.15.
01:05:13.340 --> 01:05:14.540
T, get the free threaded version.
01:05:14.760 --> 01:05:14.980
Ooh.
01:05:16.680 --> 01:05:17.560
Brett, one-upping.
01:05:19.540 --> 01:05:19.820
All right.
01:05:20.040 --> 01:05:20.780
How about a joke?
01:05:21.200 --> 01:05:22.240
I give Steve the call out.
01:05:22.380 --> 01:05:25.640
He does all that, but I just know Windows has its own built-in manager
01:05:25.760 --> 01:05:26.680
that comes from Python.org,
01:05:26.880 --> 01:05:28.220
and Steve put a lot of time on it.
01:05:28.400 --> 01:05:32.000
And it's my North Star dream to get that on every major tier one
01:05:32.120 --> 01:05:34.620
or maybe even tier two platforms for Python someday.
01:05:35.020 --> 01:05:35.760
That would be awesome.
01:05:36.700 --> 01:05:40.240
Before we go on, you should give Nick a moment for at least one of his items on there.
01:05:40.300 --> 01:05:40.860
I think it's really important.
01:05:41.200 --> 01:05:41.560
Oh, okay.
01:05:41.780 --> 01:05:42.800
I didn't know you have some, Nick.
01:05:42.800 --> 01:05:42.980
Go ahead.
01:05:43.240 --> 01:05:43.600
Oh, yeah.
01:05:44.000 --> 01:05:47.040
I just wanted to quickly call out Black Python Devs.
01:05:47.440 --> 01:05:48.840
I'm wearing the T-shirt here.
01:05:49.720 --> 01:05:51.980
One of the amazing things that one of our members,
01:05:52.160 --> 01:05:52.460
Emmanuel,
01:05:52.620 --> 01:05:54.320
is doing is taking our
01:05:55.360 --> 01:05:59.660
Python Dev student ambassadors and going across campuses in Africa.
01:06:00.380 --> 01:06:06.980
So this is a really important initiative because if you guys don't know the continent of Africa,
01:06:07.660 --> 01:06:10.760
so many countries and so many youths there,
01:06:11.180 --> 01:06:13.460
we want to promote Python.
01:06:13.600 --> 01:06:16.700
for the next generation of Python developers.
01:06:16.880 --> 01:06:19.000
I think one of the CEOs of Anaconda
01:06:19.260 --> 01:06:22.020
says that he wants a world
01:06:22.200 --> 01:06:24.500
where the next billion users are Python users,
01:06:24.720 --> 01:06:25.460
something like that.
01:06:25.980 --> 01:06:29.240
Some of those users will be in Africa.
01:06:29.480 --> 01:06:31.820
So this is an amazing campaign.
01:06:32.480 --> 01:06:34.760
And if you go to Black Python devs
01:06:35.520 --> 01:06:36.900
and the links will be in the show notes,
01:06:36.900 --> 01:06:39.000
you can support that initiative.
01:06:39.540 --> 01:06:41.560
And I'm going to also shout out
01:06:41.580 --> 01:06:43.780
with Black Python Devs at PyOhio,
01:06:43.960 --> 01:06:46.260
they did a leadership summit again.
01:06:46.920 --> 01:06:47.940
And I mean,
01:06:48.260 --> 01:06:49.260
looking at the leaders
01:06:49.760 --> 01:06:52.740
that Python Devs has over the years grown,
01:06:53.980 --> 01:06:56.440
they have something really good going on
01:06:56.780 --> 01:06:58.960
and seeing those leaders emerge
01:06:59.200 --> 01:07:00.920
has been super rewarding
01:07:01.540 --> 01:07:03.840
and, you know, doing the good stuff.
01:07:04.100 --> 01:07:04.320
Awesome.
01:07:04.640 --> 01:07:05.200
Yeah, thank you.
01:07:05.500 --> 01:07:05.660
Yeah,
01:07:05.900 --> 01:07:06.160
thanks, Nick.
01:07:06.560 --> 01:07:07.620
Anything else?
01:07:08.220 --> 01:07:10.860
All right, I got a quick short joke here for us.
01:07:11.160 --> 01:07:12.480
This comes to us from Derek Chambers,
01:07:12.680 --> 01:07:14.840
sent us in, said, well,
01:07:15.060 --> 01:07:16.320
I felt this way at some point.
01:07:16.500 --> 01:07:19.680
So theoretically, a person's applying for a job, trying to look good.
01:07:19.980 --> 01:07:24.360
Interviewer says, says here on your resume that you're an exceptional Python developer.
01:07:24.500 --> 01:07:25.140
Can you prove it?
01:07:25.380 --> 01:07:25.460
Oh,
01:07:25.640 --> 01:07:25.840
sure,
01:07:26.260 --> 01:07:27.260
says the interviewee.
01:07:27.560 --> 01:07:28.340
Run any of my code.
01:07:28.380 --> 01:07:29.820
It raises exceptions a lot of the time.
01:07:30.900 --> 01:07:32.180
Oh, I'm a sucker for a good dad joke.
01:07:32.420 --> 01:07:32.660
Dot, dot, dot, bang.
01:07:33.160 --> 01:07:34.200
I love it.
01:07:34.540 --> 01:07:39.020
I also feel like I just reached dad level because I figured out the punchline before you got there.
01:07:39.100 --> 01:07:39.480
I was like, oh,
01:07:39.640 --> 01:07:41.040
wow, I finally leveled up my dad.
01:07:41.180 --> 01:07:42.580
Joke level is being an actual dad.
01:07:42.720 --> 01:07:43.120
There you go.
01:07:43.540 --> 01:07:45.280
I feel like now the new point is parenthood.
01:07:46.200 --> 01:07:46.580
That's right.
01:07:46.920 --> 01:07:47.000
Absolutely.
01:07:47.720 --> 01:07:47.840
All right.
01:07:47.860 --> 01:07:47.960
Well,
01:07:48.460 --> 01:07:48.660
Nick,
01:07:49.080 --> 01:07:49.300
Brett,
01:07:49.700 --> 01:07:49.960
Carol,
01:07:50.260 --> 01:07:51.320
thank you so much for being here.
01:07:51.480 --> 01:07:53.460
It's really nice that you came to celebrate this.
01:07:53.640 --> 01:07:54.140
And Calvin,
01:07:54.560 --> 01:07:54.900
thanks for helping.
01:07:55.380 --> 01:07:56.020
Happy 500.
01:07:56.520 --> 01:07:56.760
Yeah.
01:07:56.980 --> 01:07:57.740
Happy 500.
01:07:58.140 --> 01:07:59.440
And happy thank you to Brian,
01:07:59.860 --> 01:07:59.980
too.
01:08:00.420 --> 01:08:00.660
Absolutely.
01:08:00.900 --> 01:08:01.560
Thank you to Brian.
01:08:02.060 --> 01:08:02.280
Bye, all.